近期刷题总结 [19 03 17]

目录

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]混合果汁 [主席树]


P3703 [SDOI2017]树点涂色 [LCT + 线段树]

挺有意思的题, 发现操作1就是不断将x到1的链变成一个联通块, 非常类似LCT的Aceess

我们令一个Splay为一种颜色, 每个点到根的颜色个数就是经过的Splay个数, Access时就可以统计, 操作2就可以差分来搞

操作3呢, 考虑直接维护每个点的答案, 然后就是在dfs序区间中求最大

然后Access时考虑对将要接上的虚儿子, 与断开的实儿子的贡献

近期刷题总结 [19 03 17]_第1张图片

近期刷题总结 [19 03 17]_第2张图片 

近期刷题总结 [19 03 17]_第3张图片


CF739B Alyona and a tree [主席树]

dis[u]-dis[v]<=a[u]  , 即, dis[u]-a[u]<=dis[v]

将dis[u]-a[u]放到主席树中, 按dfs序建树就完了


P4098 [HEOI2013]ALO [双向链表 + 可持久化0/1trie]

发现每个次大值都有一个控制的区间, 如果我们找出这个区间, 就是可持久化0/1trie模板了

定义 l1 为 x 左边第一个比它大的, l2 为第二个比它大的, r同理

于是区间有两个 (l2, r1), (l1, r2), 从小到大排序, 每过一个数在双向链表中删除, 这样保证当前的数都比我们要处理的数大


P5022 旅行 [基环树]

当时在考场真是傻, n,m这么小直接枚举断边然后用答案打擂台


P1453 城市环路 [基环树DP]

随便找到大环中的两个点, 这两个点分别DP然后打擂台


CF837G Functions On The Segments [主席树]

orz ldx

近期刷题总结 [19 03 17]_第4张图片


CF837D Round Subset [DP]

f[i][j][k] 表示前i个数, 选了j个, 有k个5, 2最多有多少个

f[i][j][k]=max(f[i-1][j][k], f[i-1][j-1][k-num5]+num2)

ans=max(min(k,f[n][m][k]))


P2827 蚯蚓 [单调性证明][队列]

暴力十分简单, 优先队列维护就可以了, 但必须要以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个队列维护


P1850 换教室 [概率DP][最短路]

最短路Floyed跑, 每一个时刻只跟上一个时刻选的什么, 有没有成功有关, 0/1 表示选或不选, 然后就是概率DP

方程有点长,就不写了


P4438 [HNOI/AHOI2018]道路 [树形DP]

观察题面 "任意乡村可以通过不超过40条道路到达首都", 然后可以暴力枚举到首都铁路公路的个数作为状态

近期刷题总结 [19 03 17]_第5张图片

空间用dfs序优化(玄学) 


 P4172 [WC2006]水管局长 [LCT]

LCT 维护最小生成树


P3732 [HAOI2017]供给侧改革 [trie树]

因为0, 1是随记的, 所以LCP的长度应该很小, 经过玄学猜测, 不会超过40

于是我们将每个点向后40位插入trie树

另外, 将询问按r排序, 每次将上一个r到这个r之间的字符插入trie树, 用trie树维护LCP为len的出现的最后位置pos

len对答案的贡献就是 len * (pos[len] - pos[len+1] + 1)


P2336 [SCOI2012]喵星球上的点名 [SA + 莫队]

将名字和询问传到一起跑SA, 对于每一个询问串, 对它有贡献的就是rank与它相邻的串, 且lcp大于询问串的长度的串

这个范围可以二分, 然后就变成区间有多少个不同的名字, 莫队解决


P4454 [CQOI2018]破解D-H协议 [BSGS模板]


P4462 [CQOI2018]异或序列 [异或前缀和+莫队]

转换为有多少个(i,j) 使si ^ sj-1 = k, 每遇到一个sx 将sx放进桶中, 它与前面的数的贡献就是 c[sx^k]


P4679 [ZJOI2011]道馆之战 [LCT]

近期刷题总结 [19 03 17]_第6张图片

LCT维护(感觉比树剖方便), Splay翻转时记得交换dis和max

 


CF833B The Bakery [线段树优化DP]

orz ldx

近期刷题总结 [19 03 17]_第7张图片 


P2604 [ZJOI2010]网络扩容 


P4602 [CTSC2018]混合果汁 [主席树]

二分答案很容易想到(先将果汁按d从大到小排序)

然后贪心去p 小的果汁, 我们考虑按p建权值线段树, 记siz为p的和, val为p*l的和

我们在权值线段树上二分(如果val >= g就走左边, 否则走右边, 体积加上siz), 最后看siz有没有L即可

因为要查每个点之前的权值线段树, 主席树就可以了

你可能感兴趣的:(可持久化数据结构,主席树,LCT,后缀数组,莫队,网络流)