较高难度dp题目选做
1.CF559E Gerald and Path
题目大意:
有
难度:Normal,*3000
大概就是要想着先对一端排序,然后每次钦定当前线段的方向然后去dp。
设计一个
转移的时候如果当前向右放就比较好处理,因为再往右没有被覆盖过的了,全是新的贡献。设当前线段固定的端点的位置是
但是向左放的时候可能会出问题,因为他可能会覆盖到之间没有被覆盖过的部分。(前面的都太短了,而这个特别的长)
借个图:
所以为了避免这种情况,我们可以枚举一个
令
2.CF1305G Kuroni and Antihype
剧透别看后面的白字 $\color{white}\text{逛洛谷看到有人在要MST的牛逼题就想到了这个}$
题目大意:
现在有
现在,有一个传销组织,每个人有两种操作:
1、主动加入传销组织,这样的话,传销组织不会给你钱;
2、邀请自己的一个朋友加入传销组织,这样的话,传销组织会奖励你数值等于你的年龄的钱。(当然,执行该操作的人必须已经进入传销组织了)
每个人只可以进入传销组织一次。
现在,请你输出,如果
难度:Normal+,*3500
妙!难点就一句话,上面的白字。
每个点只能加进这个组织一次,就像一棵树每个节点最多一个父节点一样,难度就在于怎么去构造这个MST。
设
由于只有两个点与起来为
这就可以推出一个能过的
此题还有
3.CF1188D Make Equal
题目大意:
给出
难度:Hard-,*3100
我不会做,降智。
一个显然的(对我来说并不显然)的转化是要变为求
下面让
从小到大决策当前这个
这一位是不是 中有多少个数这一位是 (接下来会产生进位) - 前面
为的进位对这一位产生的贡献
前两个好处理,就是第三个不好处理。
如果 bitmask 枚举前面那些数,那么复杂度就爆炸了(
又是一个对我来说不显然的结论,就是对于最低的
令
可以发现我们不关心这个数到底是多少,只关心
令
- 上次进位,这一位是
,有 个。 - 上次进位,这一位是
,有 个。 - 上次未进位,这一位是
, 个。 - 上次未进位,这一位是
, 个。
这一位取
这一位取
没了。有就是这玩意和基数排序很像,这么写可以减小常数。
4.CF739E Gosha is hunting
题目大意:
你要抓神奇宝贝!
现在一共有
你有
『宝贝球』抓到第
不能往同一只神奇宝贝上使用超过一个同种的『球』,但是可以往同一只上既使用『宝贝球』又使用『超级球』(都抓到算一个)。
请合理分配每个球抓谁,使得你抓到神奇宝贝的总个数期望最大,并输出这个值。
我可以出到
难度:Easy—,*3000
就这也配*3000???
裸的wqs二分,套一次可以做到
那就简单写一下什么是wqs二分。
原题没有代价只有次数限制,现在我们想办法取消这个次数限制。
如果直接取消那么肯定是全部用掉最优,所以我们对每次用就加上一个代价。
然后二分这个代价,直到贪心(或者dp)后得到使用的次数和限制相同且答案最大。
5.CF1463F Max Correct Set
题目大意:
规定一组正整数
- 如果
并且 ,那么 并且
对于给定的数值
难度:Normal+,*3100
神奇的思维题,和我之前做过的一道MO题好像???
结论是可以有个长度为
证明挺难的,可以参考 7KByte大爷的 或者 feecle6418大爷的 。
6.CF1616H Keep XOR Low
题目大意:
给你
你需要求出 {\rm xor}a_j\le x$。
求选取
难度:Normal+(可能我不熟悉这类题),*3000
一眼异或,鉴定为 01-trie。设计
这么dp会寄掉,应为当这一位是
怎么办?大胆点,令
看起来这个玩意很扯淡,但是是可行的。(记当前考虑到第
若
若
7.[AGC024F] Simple Subsequence Problem
题目大意:
有一个 01 串集合
由于
- 你将得到
个 01串,第个串的长度为 。 - 第
个字符串的第 个字符,代表数字 的、长度为 的二进制表示是否出现在 中。
难度:Hard(?),difficulty 3544
这是我的子序列自动机入门题。
题目相当于对于每个串,对其所有子序列的值+1,问你最后所有可能的01串的值的最大值是多少。
我们不可以枚举每个串的所有子序列,所以这之后就要用到一个叫做子序列自动机的玩意。
考虑如何贪心的去确定一个01串是不是另外一个01串的子序列。假设当前匹配串的开头是
所以我们就可以模拟这个过程,令
由于
8.[AGC016F] Games on DAG
题目大意:
给定一个
难度:Normal(?),difficulty 3754
我的博弈论入门题
这题本质上就是要求SG(1) 和 SG(2) 不相同,然后可以转化为
SG(i) 的定义:它的所有邻居的SG()的mex
所以我们就可以每次枚举新的SG()值为0的点,要求满足他们之间不能互相连边,之前枚举的所有不是0的点至少要向这些点中的一个点连边,这些点向不是0的点的连边没有要求
然后就是1号点和2号点要么同时在不是0的点,要么同时是新的0。
这是个子集枚举,复杂度
9.CF1149D Abandoning Roads
题目大意:
一张
难度:Hard++++,*3000
溜去看题解了。
你告诉我这只有3000???
这复杂度是人能想出来的????
由于是在所有最小生成树中,所以有这么一个性质:一条连续的全为
就有了这么一个结论:如果把原图中所有重边删掉,会剩下一些联通块。一条路径可能在最小生成树上,当且仅当它没有离开一个联通块后再回到原来那个联通块中。
然后就是令
这个方法时
但是现在还有这么一个结论:我们不用考虑所有大小
结束了。妙死了啊!时间复杂度
10.APC001F XOR Tree
题目大意:
给你一棵有
树边编号从
你可以对树执行任意次操作,每次操作选取一条链和一个非负整数
问最少需要多少次操作,使得所有边的权值都为0。
难度:easy-,difficulty 2865
就这也能黑题?洛谷恶评严重。
一个套路是将比边权下放到点权,令每个点的点权为它周围一圈边的权值的异或和。
现在如果对一条
最后就是玩消消乐,消完以后每种权值的数量不会超过
11.CF232E Quick Tortoise
题目大意:
在一个
难度:Normal,*3000
有点套路的题,考虑分治。
如果当前这些询问中满足存在一行使得所有询问可能的路径都必须经过这一行的一个点,那么这些询问可以在
然后就可以分治了。起点和终点都在
12.CF1707E Replace
题目大意:
给定一个长为
定义一个二元组函数如下:
你需要回答 -1。
难度:Hard++,清新思维题,*3500
这题中有区间max/min,就很自然的想到了ST表和倍增。
如果裸的倍增会很烦,因为有
考虑能不能用类似ST表的方法来处理,就是用两个较大的、有交集的区间并称一个大区间,就能将
注意到
13.CF1710D Recover the Tree
题目大意:
你需要根据题目给出的信息构造出一棵树,满足如下条件:
- 树的节点个数为
。 - 对于每个区间
给出是或不是连通块。
数据保证有解,
难度:Normal++,*3400
好题。
我们从小到大考虑所有可能的区间(类似区间dp的套路)。
假设我们当前考虑到有一个联通的区间
14.CF1616G Just Add an Edge
这场的H也在这篇blog中,是#6,但应该没有这个G难/hsh
题目大意:
给定一个 DAG,边一定从编号小的点连向编号大的点,求有多少对
难度:Hard+(*114514),不会!
先咕着,明天中午看题解。
我超,终于看懂了,神仙题。
所以我们可以枚举
考虑怎么优化。我们找到一个最靠做的
证明可达的话,如果左边的
注意一些细节。以及注意当
15.[AGC010E] Rearranging
题目大意:
有一个
高桥君会把整个序列任意排列,然后青木君可以进行任意次操作,每次选择两个相邻的互质的数交换位置。
高桥君希望最终序列的字典序尽量小,而青木君希望字典序尽量大。求最终序列。
难度:Normal,difficulty 3887
有这么难吗?洛谷和AT都恶评?我独立切了好吧。
哦等下我不会证明这个结论/qd
反正就是说,我们考虑建立图论模型。如果
所以,第一个人的操作就相当于对这个无向图定向,第二个人的擦欧总相当于求出这张DAG的一个最大拓扑序。
手玩以后可以发现结论:对于每个连通块,我们从最小的一个数入手,每到一个点
然后用个priority_queue进行topsort就行了。
16.[AGC027E] ABBreviate
题目大意:
给定一个只含小写字母
- 选取
中连续的两个字符 ,把它们删去,替换成一个字符 。 - 选取
中连续的两个字符 ,把它们删去,替换成一个字符 。
请你求出执行若干次操作后,能够得到的本质不同的字符串有多少个,答案对
。
难度:Hard,difficulty *3634
根据大眼观察可以发现,如果令
我们考虑什么
然后就可以dp了。记录以下前缀和,和一个