二言不发

有空再补“一言不发”吧,以前忘记写了,气死了👿

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

  1. 建立边双,缩点
  2. 建立每个询问的虚树

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\)))

\[f_u=\sum f_v+[P]w_u \]

会发现这个 dp 非常奇怪,而且也不是完整的。因为可能还有不是 \(u\) 的直接儿子 \(x\),也可以给 \(f_u\) 进行贡献( \(x\)\(x-fa(x)\) 对应的链延伸得很浅之类的)。

所以我们用一个容器把所有 \(v\) 子树里面的绳子,都存到 \(v\) 里边。然后如果我需要用一条在 \(v_0\) 子树里面的绳子,权值为 \(w\),我就会有如下转移:

\[\large f_u=\sum\limits_{v\ne v_0} f_v+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

注意:

  1. 其他的熊不知道今天熊喝的到底是哪些位置的桶。
  2. 一天可以每个熊都会喝桶。

考虑信息论。(以前不太明白,现在不言而喻了~

\[R_i=\sum\limits_{j=[0,\min(p,n-1)]}\binom n j i^j \]

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\) 压缩成一个括号的方案数。

则有:

\[f_{l,r}=\sum\limits_{i\in [l,r-1]} g_{l,i}*f_{i+1,r} \]

为什么只用枚举 \(g\) 在左边的情况?因为 \(g\) 在右边的情况已经在 \(f_{i+1,r}\) 中枚举过了(归纳)。

以及:

\[g_{l,r}=\sum\limits_{d 是循环节} f_{l,l+d-1} \]

然后记忆化搜索,不断递归就好。

时间复杂度: \(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\) 维可以滚掉)

\[f_{i+1,j,S}+=f_{i,j,S} [i+1\le j]\\f_{i+1,\max (j,l_k),S|k}+=f_{i,j,S}\text{(加入第k条线段)} \]

*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。

posted @ 2022-05-23 21:24  BlankAo  阅读(81)  评论(0编辑  收藏  举报