别我为啥2021的都出来了才写2020的
口胡进度:(11/50)
代码进度:(10/50)
CF504E Misha and LCP on Tree
一棵树,每个点一个字母,求两条路径的LCP, n ≤ 3 × 1 0 5 , q ≤ 1 × 1 0 6 n\le 3\times 10^5,q\le 1\times 10^6 n≤3×105,q≤1×106
哈希记正串反串即可,代码咕了
CF505E Mr. Kitayuta vs. Bamboos
好像写了个比较优的做法。
首先显然考虑二分答案,对于一个最后的值,一个点要被砍的次数是确定的,以及可以浪费多少(即可以不大于p时就砍)也可以确定,如果砍一次不会使它接下来要砍的次数-1,那么可以不砍。 于是直接扫一遍,拿vector
记录第
i
i
i 次操作时有哪些新增的可以砍的以及一个队列维护当前能被砍的集合即可,另外注意有时候你砍完可以立刻砍下一刀,特判一下即可。时间复杂度
O
(
(
n
+
m
k
)
log
V
)
O((n+mk)\log V)
O((n+mk)logV)。
CF512D Fox And Travelling
给定一张
n
n
n 个点
m
m
m 条边的无向图,一个点只有当与它直接相连的点中最多只有一个点未被遍历过时才可被遍历。
询问对于每个
k
∈
[
0
,
n
]
k∈[0,n]
k∈[0,n],遍历
k
k
k 个点的方案数。
n ≤ 100 n\le 100 n≤100
盯了好久才发现只需要考虑树的情况。。。DP也策不清。。。
而树分成 2 2 2 种,与环有边相连的有根树和无边相连的无根树。
对于有根树,显然直接DP删叶子即可,只有所有子树都被删掉时才能删当前节点。
对于无根树,我们枚举最后一个删掉的点,不难发现一个联通块在所有以块外节点为根的情况时都会被算进去,所以每次要除去 s i z − k siz-k siz−k 的贡献,当然整棵子树不用除。
最后背包合并即可。
CF516D Drazil and Morning Exercise
给出一棵有边权的树,令 f ( x ) = max { d i s ( x , i ) } f(x)=\max\{ dis(x,i)\} f(x)=max{dis(x,i)},每次给出 l l l,求最大的联通块满足块内 max f ( x ) − min f ( x ) ≤ l \max_{f(x)}-\min_{f(x)}\le l maxf(x)−minf(x)≤l。 1 ≤ n ≤ 1 0 5 , 1 ≤ q ≤ 50 1\le n\le 10^5,1\le q \le 50 1≤n≤105,1≤q≤50。
首先通过树上直径的两个端点 O ( n ) O(n) O(n) 求一手 f ( x ) f(x) f(x)。然后发现以直径上带权中点为根时整棵树是一个小根堆,于是就可以尺取法了。
然而如何尺取还卡了我一会,具体就是枚举min,用并查集维护联通块的连通性及大小,而将r减小时由于子树肯定被删光了,所以直接将所在联通块的siz-1即可。
CF516E Drazil and His Happy Friends
不看题解是8可能的
思路懂了,但是不太会实现,差不多是对着粉兔代码抄了一遍,要再花时间。
令 d = gcd ( n , m ) d=\gcd(n,m) d=gcd(n,m) ,则一起玩的男生女生编号肯定对 d d d 同余,所以就变成了 d d d 个子问题。此时 n d , m d \frac{n}{d},\frac{m}{d} dn,dm 互质,每个子问题只要有一个人一开始就高兴就显然可以扩散到所有人,否则显然无解。
然后我们对每个子问题分开考虑,对于最后一个高兴的男生和最后一个高兴的女生的时间分别取max就是这个子问题的答案,接下来只考虑女生。
如果第 i i i 个男生让第 j j j 个女生高兴,那么 n n n 次之后就会让第 ( j + n ) ( m o d m ) (j+n)\pmod m (j+n)(modm) 个女生高兴, c n cn cn 次之后就会让第 ( j + c n ) ( m o d m ) (j+cn)\pmod m (j+cn)(modm) 个女生高兴。
于是可以求一手最短路,第 i i i 个女生向第 ( i + n ) ( m o d m ) (i+n)\pmod m (i+n)(modm) 个连边,初始高兴的男生/女生 i i i 向第 i ( m o d m ) i\pmod m i(modm) 个女生连边权为 i i i 的边(因为你发现都是在第 i i i 次之后每 n n n 次向后贡献),求最短路即可。
但是点集1e9,GG。
发现这其实在一个环上,特殊点之和只有 O ( n ) O(n) O(n) 个,把环拉直之后 O ( n ) O(n) O(n) 转移即可。拉直需要用一次exgcd。
CF521D Shop
从同学口中获得提示后做出。。
首先一个基本结论是先赋值再加再乘且赋值每个数只操作一次且相同类型互不影响。
由于题目要求最大化乘积,所以我们考虑将所有操作都转化成乘法。
p zk \color{black}\text{p}\color{red}\text{zk} pzk提示:全都是加很好做。
仔细一想好像确实,每个数的加操作显然按从大到小顺序进行,我们加完后再次计算与乘等效的系数即可。
然后发现赋值操作也可以当成加,当然每个数只能保留最大的赋值。
然后用个堆取m次即可。
CF521E Cycling City
一个无向简单图(不保证联通),求是否能找到2个点满足这2个点之间有至少3条不重复的路径。 n , m ≤ 2 × 1 0 5 n,m\le 2\times 10^5 n,m≤2×105。
又是一道看了题解的题。。发现题目要求等价与一棵生成树上有一条边被至少2条非树边覆盖。
由于找到一个合法的边就能停止,所以所有操作都可以直接暴力。一条边被哪条路径覆盖可以直接记录(因为只会有1条,第2条出现的时候就可以算答案了)
然后我们考虑找到2条边之后怎么办。不难发现用暴力找LCA的方法覆盖树上路径时,我们发现的第一条被2条路径覆盖的边是两条路径两个端点之一的LCA。
同时,这时候千万不要想复杂,无向图生成树的非树边都是返祖边。
令两条路径分别为 ( a , b ) , ( c , d ) (a,b),(c,d) (a,b),(c,d),且 g = LCA(a,c) g=\operatorname{LCA(a,c)} g=LCA(a,c),且 d e p b ≥ d e p d dep_b\ge dep_d depb≥depd 。这样的话就能构造出3条 g->b 的了:
1.树上g->b
2.g->a,a->b
3.g->c,c->d,d->b
搞定,时间复杂度 O ( n ) O(n) O(n) 。
CF526F Pudding Monsters
一个 n × n n\times n n×n 的棋盘,每行每列都有 1 1 1 个棋子,求有多少个 k × k k\times k k×k 的子棋盘中恰好有 k k k 个格子 ( k ∈ [ 1 , n ] ) (k\in[1,n]) (k∈[1,n])。 1 ≤ n ≤ 3 × 1 0 5 1\le n \le 3\times 10^5 1≤n≤3×105 。
这题一开始并不会。
看了题解之后发现可以直接令 a x = y a_x=y ax=y ,转化为 1 1 1 维的问题,现在变成了求 max { a l … a r } − min { a l … a r } = r − l \max\{a_l\dots a_r\}-\min\{a_l\dots a_r\}=r-l max{al…ar}−min{al…ar}=r−l 的计数。
不妨枚举 r r r ,将无关项移到左边
max { a l … a r } − min { a l … a r } + l = r \max\{a_l\dots a_r\}-\min\{a_l\dots a_r\}+l=r max{al…ar}−min{al…ar}+l=r
不难发现左边两项只需维护后缀 max \max max 和后缀 min \min min 即可,可以用单调栈实现。而由于 max { a l … a r } − min { a l … a r } + l ≥ r \max\{a_l\dots a_r\}-\min\{a_l\dots a_r\}+l\ge r max{al…ar}−min{al…ar}+l≥r,且 l = r l=r l=r 时必能取到最小值,所以我们直接用线段树维护最小值的数量即可。
CF526G Spiders Evil Plan
一棵树,有边权,每次询问给出 x , y x,y x,y ,求由 y y y 个路径组成的、经过 x x x 的边权最大的联通块。
又是一道不会做的神题……首先路径显然是一个叶子到另一个叶子,而每个叶子的贡献实际上是它到它所在长链的顶端的父亲的距离,这个感性理解非常对,然而我之前就是想不到。。。
于是我们有了个每次长剖的
O
(
n
q
)
O(nq)
O(nq) 做法,显然不够。我们又发现
x
x
x
所在最长链肯定在直径的两个端点之一取到,于是只需要对这两个点分别做一次长剖即可。
然后这样的方案可能不包括 x x x ,我们有两种处理方法:
- 把最短链去掉,加入 x x x 所在长链。
- 将最靠近 x x x 的长链下半部分改成 x x x 的长链
两者都要找到 x x x 最浅的没有被选的祖先,倍增即可。
CF605E Intergalaxy Trips
给出一个有向图,每条边每天出现的概率都是 p i , j p_{i,j} pi,j,你也可以选择停留一天,求从 1 1 1 走到 n n n 的最小期望天数。
这个好像还算简单,直接Dijkstra
转移即可,还是比较直观的。