目录
P3703 [SDOI2017]树点涂色 [LCT + 线段树]
CF739B Alyona and a tree [主席树]
P4098 [HEOI2013]ALO [双向链表 + 可持久化0/1trie]
P5022 旅行 [基环树]
P1453 城市环路 [基环树DP]
CF837G Functions On The Segments [主席树]
CF837D Round Subset [DP]
P2827 蚯蚓 [单调性证明][队列]
P1850 换教室 [概率DP][最短路]
P4438 [HNOI/AHOI2018]道路 [树形DP]
P4172 [WC2006]水管局长 [LCT]
P3732 [HAOI2017]供给侧改革 [trie树]
P2336 [SCOI2012]喵星球上的点名 [SA + 莫队]
P4454 [CQOI2018]破解D-H协议 [BSGS模板]
P4462 [CQOI2018]异或序列 [异或前缀和+莫队]
P4679 [ZJOI2011]道馆之战 [LCT]
CF833B The Bakery [线段树优化DP]
P2604 [ZJOI2010]网络扩容
P4602 [CTSC2018]混合果汁 [主席树]
挺有意思的题, 发现操作1就是不断将x到1的链变成一个联通块, 非常类似LCT的Aceess
我们令一个Splay为一种颜色, 每个点到根的颜色个数就是经过的Splay个数, Access时就可以统计, 操作2就可以差分来搞
操作3呢, 考虑直接维护每个点的答案, 然后就是在dfs序区间中求最大
然后Access时考虑对将要接上的虚儿子, 与断开的实儿子的贡献
, 即,
将dis[u]-a[u]放到主席树中, 按dfs序建树就完了
发现每个次大值都有一个控制的区间, 如果我们找出这个区间, 就是可持久化0/1trie模板了
定义 l1 为 x 左边第一个比它大的, l2 为第二个比它大的, r同理
于是区间有两个 (l2, r1), (l1, r2), 从小到大排序, 每过一个数在双向链表中删除, 这样保证当前的数都比我们要处理的数大
当时在考场真是傻, n,m这么小直接枚举断边然后用答案打擂台
随便找到大环中的两个点, 这两个点分别DP然后打擂台
orz ldx
f[i][j][k] 表示前i个数, 选了j个, 有k个5, 2最多有多少个
暴力十分简单, 优先队列维护就可以了, 但必须要以O(n)的算法才过得了
我们发现, 对于某个蚯蚓A1, 分成B1, C1, 和某个蚯蚓A2, 分成B2,C2
如果A1在A2之前且, 那么B1在B2之前, C1在C2之前
因为 B1 = (A1*p) + q, B2 = (A2 + q) * p, B1 > B2, 于是3个队列维护
最短路Floyed跑, 每一个时刻只跟上一个时刻选的什么, 有没有成功有关, 0/1 表示选或不选, 然后就是概率DP
方程有点长,就不写了
观察题面 "任意乡村可以通过不超过40条道路到达首都", 然后可以暴力枚举到首都铁路公路的个数作为状态
空间用dfs序优化(玄学)
LCT 维护最小生成树
因为0, 1是随记的, 所以LCP的长度应该很小, 经过玄学猜测, 不会超过40
于是我们将每个点向后40位插入trie树
另外, 将询问按r排序, 每次将上一个r到这个r之间的字符插入trie树, 用trie树维护LCP为len的出现的最后位置pos
len对答案的贡献就是 len * (pos[len] - pos[len+1] + 1)
将名字和询问传到一起跑SA, 对于每一个询问串, 对它有贡献的就是rank与它相邻的串, 且lcp大于询问串的长度的串
这个范围可以二分, 然后就变成区间有多少个不同的名字, 莫队解决
转换为有多少个(i,j) 使si ^ sj-1 = k, 每遇到一个sx 将sx放进桶中, 它与前面的数的贡献就是 c[sx^k]
LCT维护(感觉比树剖方便), Splay翻转时记得交换dis和max
orz ldx
二分答案很容易想到(先将果汁按d从大到小排序)
然后贪心去p 小的果汁, 我们考虑按p建权值线段树, 记siz为p的和, val为p*l的和
我们在权值线段树上二分(如果val >= g就走左边, 否则走右边, 体积加上siz), 最后看siz有没有L即可
因为要查每个点之前的权值线段树, 主席树就可以了