有空再补“一言不发”吧,以前忘记写了,气死了
https://www.luogu.com.cn/training/12
CF627E Orchestra
https://www.luogu.com.cn/problem/CF627E
:https://www.luogu.com.cn/blog/46396/solution-cf627e
*CF639E Bear and Paradox
https://www.luogu.com.cn/problem/CF639E
CF639F Bear and Chemistry
https://www.luogu.com.cn/problem/CF639F
- 建立边双,缩点
- 建立每个询问的虚树
CF666D Chain Reaction
https://www.luogu.com.cn/problem/CF666D
一眼模拟,不知道为什么黑。
CF666E Forensic Examination
https://www.luogu.com.cn/problem/CF666E
一眼融合怪题目。和你的名字很像(但是更简单)。
建立广义 SAM。
先通过倍增找到 \(S[pl,pr]\) 所在的后缀树节点,线段树合并,找到出现颜色最多的 \(T\) 就好。
CF671D Roads in Yusland
https://www.luogu.com.cn/problem/CF671D
以下称给定的路径为“绳子”。
这个问题很像背包/线段覆盖一样的问题,于是想到 dp。
设 \(f_u\) 为 \(u\) 这个点,覆盖它的所有子树和 \(u-fa(u)\) 边,的最小花费。
那么有一个转移就类似于:(如果这些 \(f_v\) 没有一个覆盖到 \(u-fa(u)\),那么还要额外放一个绳子(记这个事件为 \(P\)))
会发现这个 dp 非常奇怪,而且也不是完整的。因为可能还有不是 \(u\) 的直接儿子 \(x\),也可以给 \(f_u\) 进行贡献( \(x\) 的 \(x-fa(x)\) 对应的链延伸得很浅之类的)。
所以我们用一个容器把所有 \(v\) 子树里面的绳子,都存到 \(v\) 里边。然后如果我需要用一条在 \(v_0\) 子树里面的绳子,权值为 \(w\),我就会有如下转移:
但是还有一个问题就是,如果这条绳子不超过 \(u\),那么就应该把它从容器里删除。
这个容器就是可并堆,因为它需要合并/求最小值/整体减去一个 \(f_v\)/删除。
整体减去一个 \(f_v\) 是因为:如果令 \(w'=w-f_v\) 那么就可以直接把 sigma 的下标限制去掉。
对于后面两个操作,分别是:打懒标记/判断根节点是否非法(若绳子头深度大于等于 \(dep_u\) 则非法),再删除。
最后答案,就是 1 的所有儿子的 \(f\) 之和。
复杂度是 \(O(n\log n)\)。
*CF671E Organizing a Race
https://www.luogu.com.cn/problem/CF671E
CF643D Bearish Fanpages
https://www.luogu.com.cn/problem/CF643D
基环树?
直接模拟即可,修改就是把原来的父亲的贡献减去,把新的父亲的贡献加上,以此类推。
《新型大模拟》
CF643F Bears and Juice
https://www.luogu.com.cn/problem/CF643F
注意:
- 其他的熊不知道今天熊喝的到底是哪些位置的桶。
- 一天可以每个熊都会喝桶。
考虑信息论。(以前不太明白,现在不言而喻了~
j 是枚举最终有多少个熊睡觉。
binom 是枚举哪些熊睡觉。
i^j 是枚举熊睡觉的时间。
然后暴力计算就可以了。注意因为模数是 \(2^{32}\) 非质数,所以要枚举 binom 的分子分母进行约分。
CF643G Choosing Ads
https://www.luogu.com.cn/problem/CF643G
原题。
CF679E Bear and Bad Powers of \(\color {red} {\text{ Sutr}}\)
https://www.luogu.com.cn/problem/CF679E
如果没有操作二,那么就可以暴力做,因为总共每个数只会被操作 \(\log_{42}\) 次。
有了操作二,发现区间都是一个数字,如果可以让一段相同数字都只操作一遍,那是极好的了!
于是我们对于一个操作二(覆盖操作),将 \(r\) 设为要修改的值,而 \([l,r-1]\) 设为 -1。对于一个 -1,代表他要“向右看齐”,即他的实际的值为他右边第一个不是 -1 的数字。
那么对于操作 3,只用将 \(l-1\) 和 \(r\) 位置处理一下即可。
找到这个右边第一个不是 -1,用 set 的 lower_bound 即可。因为我每次指挥增加一两个实际含义的位置,所以是对的。
CF685C Optimal Point
https://www.luogu.com.cn/problem/CF685C
:https://www.luogu.com.cn/blog/chen-zhe/solution-cf685c
直接二分,然后乱推了。
*CF696F ...Dary!
https://www.luogu.com.cn/problem/CF696F
CF698D Limak and Shooting Points
https://www.luogu.com.cn/problem/CF698D
一开始看数据范围这么小,于是想到枚举,后来发现不行,一看题解,原来还是枚举。。。
设 \(p_{i,j}\) 为一个 vector 代表从 \(i\) 人射击到 \(j\) 怪,中间的怪物依次是什么。然后枚举 \(i\),枚举 \(j\),\(i\) 肯定是最后射击的,再枚举剩下人的射击顺序,看看能不能依次射掉 \(p_{i,j}\) 的怪物。时间复杂度 \(O(n*k!*k)\)。
CF700E Cool Slogans
https://www.luogu.com.cn/problem/CF700E
愚蠢的字符串题目
首先 \(s_{k-1}\) 一定是 \(s_k\) 的后缀,因为如果不是可以删除后面的字符,显然不劣。
设 \(f_u\) 为后缀树上 \(u\) 对应的节点,可以成为 \(s_k\) 的最大的 \(k\)。
我们设现在 \(X\) 在 \(u\) 中出现了两次(也就是 \(u\) 在 \(X\) 的子树中)
\(u\) 对应的子串结束位置集合中,任意取一个位置 \(t\) 则
\(u\) 肯定在 \(X\) 中出现一次,那么只要再找到一个在 \([t-len(u)+len(X),t-1]\) 的叶子节点就好了。在 \(X\) 节点上查询,这个显然可以用线段树合并做到。
我们是从上往下更新 dp 值的。
怎么确定更新 \(f_u\) 的 \(X\)?同时记录一个最优 \(g_i\),代表最优的 \(X\),如果某一次更新有 \(f_{u'}=f_{X'}+1\),那么 \(g_{u'}=u'\),反之 \(g_{u'}=g_{X'}\)(一个串 \(A\) 以及他的子串 \(B\),如果 \(f_A=f_B\),那么肯定 \(B\) 不劣)。
怎么取 \(t\)?任意一个 \(t\) 即可。因为 \(X\) 肯定是 \(u\) 的前缀,所以取到的肯定是较前的。比如 aba
那么 \(t=3\) 是必然的,对应到检索的是第一个 a
,然后区间查询会查到第三个 a
。
*CF704B Ant Man
https://www.luogu.com.cn/problem/CF704B
CF704C Black Widow
https://www.luogu.com.cn/problem/CF704C
:https://www.luogu.com.cn/blog/xht37/solution-cf704c
CF704D Captain America
https://www.luogu.com.cn/problem/CF704D
一眼网络流。然后不会。
假设 \(r\le b\),
首先套路:全部涂成红色。
然后我们建立一排点代表横坐标,一排点代表纵坐标,然后对于一个点 \((x,y)\) 连边 \(x\to y:1\)。
对于一行的 \(d\) 的限制,如果这一行有 \(cnt\) 个点,则这一行涂红色个数为 \([(cnt-d)/2,(cnt+d)/2]\)(前上取整,后下取整)。对于一列类似。
于是就从源点向横坐标的代表点连边,流量限制为上面所说的区间(没错是上下界)。纵坐标的代表点向汇点连边,同理。
然后跑网络流即可。因为这是类二分图,所以它是 \(O(n\sqrt n)\) 的。
CF704E Iron Man
https://www.luogu.com.cn/problem/CF704E
首先重链剖分。那么每个人的路线,可以划分为 \(\log\) 个重链上的链上移动。
所以只用处理一个链上的问题。
建立一个坐标系,横坐标就是链点,纵坐标是时间。那么把每个路线投影成一个线段,现在要求最早的线段相交时间。
维护一个 set,比较方式为横坐标。然后按照时间依次插入线段/把线段删除。每次操作时,将操作线段的前驱后继处理一下,看看是否有交。
因为在找到第一次有交的时间前,所有的线段都是互不相交的,也就是两两线段的相对顺序不变,所以这样是对的。
CF708D Incorrect Flow
https://www.luogu.com.cn/problem/CF708D
:https://www.luogu.com.cn/blog/PinkRabbit/solution-cf708d
*CF708E Student's Camp
https://www.luogu.com.cn/problem/CF708E
居然是初二题……
AGC020D Min Max Repetition
https://www.luogu.com.cn/problem/AT3858
:https://www.luogu.com.cn/blog/master-040626/at3858-agc020d-min-max-repetition
为什么最小连续长度 \(k\) 是那个东西?因为用小的去隔断大的,可以隔断成 \(m+1\) 段,所以是 \(n/(m+1)\)。
AGC020E Encoding Subsets
<https://www.luogu.com.cn/problem/AT3859 >
遇到“括号类”,“编码压缩类”,想到区间 dp。
设 \(f_{l,r}\) 为 \(l\sim r\) 的方案数,\(g_{l,r}\) 为把 \(l\sim r\) 压缩成一个括号的方案数。
则有:
为什么只用枚举 \(g\) 在左边的情况?因为 \(g\) 在右边的情况已经在 \(f_{i+1,r}\) 中枚举过了(归纳)。
以及:
然后记忆化搜索,不断递归就好。
时间复杂度: \(T(n)=\sum\limits_{i\in [1,n]}\sum\limits_{d|n} (\ i+T(d)\ )\),反正能过。
AGC020F Arcs on a Circle
https://www.luogu.com.cn/problem/AT3860
:https://www.luogu.com.cn/blog/et2006/solution-at3860
设 \(f_{i,j,S}\) 在圆周的第 \(i\) 个点,当前可以覆盖的最右位置为 \(j\),用了的线段集合为 \(S\)。(事实上,\(i\) 维可以滚掉)
*AGC021E Ball Eat Chameleons
https://www.luogu.com.cn/problem/AT3871
又是初中题,我紫菜吧。
*AGC021F Trinity
https://www.luogu.com.cn/problem/AT3872
*AGC022D Shopping
https://www.luogu.com.cn/problem/AT3949
先使得 \(t_i=t_i\bmod 2L\) ,然后定义两个 bool 值,\(l_i\) 代表搭乘从左边来的车子,能否当车子从右边来的时候坐进车;\(r_i\),从右边来的车子,能否当车子从左边来的时候坐进车。
上界地说,购买一个超市需要 \(2L\) 时间(因为已经 \bmod 过 2L 了)。但是如果遇到一个 \(i<j\) 而且 \(r_i=1,l_j=1\) 的,那么就可以在 \(2L\) 时间内够完 \(i,j\) 两个超市(画图可知)。而其它情况(例如 \(r_i=1,l_j=0\))均不能省时间。
于是做匹配即可。具体是,如果是一个 \(l\) 点,那么放进栈。如果是一个 \(r\) 点,那么弹栈。如果是一个 \(l\&r\) 点:如果栈为空,?突然不会.jpg
AGC022E Median Replace
https://www.luogu.com.cn/problem/AT3950
:https://www.luogu.com.cn/blog/ICANTAKIOI/solution-at3950
*AGC022F Checkers
https://www.luogu.com.cn/problem/AT3951
AGC023D Go Home
https://www.luogu.com.cn/problem/AT3955
《亿万房间的大楼和亿万容量的班车。
每一座大楼,都高耸而立,随心所欲地拨开云层,自由自在地穿过臭氧,漫不经心地在陨石间穿梭,直到生长到能撬动地球的长度。
而中间的班车,也不甘示弱。宽能跨海,长能载江。结构纯粹,单一扩展,简洁结构,却运万物。
然而,赛博的世界下,变味的地球中,班车上面的人们,却只是想着 Go Home。》
:https://www.luogu.com.cn/blog/wozaixuexi/solution-at3955
*AGC023E Inversions
https://www.luogu.com.cn/problem/AT3956
AGC023F 01 on Tree
https://www.luogu.com.cn/problem/AT3957
最水紫题。
考虑切掉一个点之后,它的所有子树是不会交错的,也就会形成[l1,r1][l2,r2][l3,r3]
的样子。于是如此,那便这样!
AGC024D Isomorphism Freak
https://www.luogu.com.cn/problem/AT3961
为了达到颜色数最少,最终的树必定是以某一个点或某一个边为根,深度相同的所有点的子树同构,这样的答案是深度个颜色。
然后对于第 i 层和第 i+1 层,要相乘一个 \(cnt_i*cnt_{i+1}\)。
比如第 100 层有 5 个节点,其中有 4 个是叶子节点,还有一个有 8 个儿子,在 101 层,且 8 个儿子权值叶子节点。那么为了补全,肯定要让 100 层的 4 个叶子,每个都多上 8 个儿子。所以是 5*100。