2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)

传送门
首先这题我们要用到一个叫做支配树( d o m i n a t o r dominator dominator t r e e tree tree)的东西,还有一个叫做主席树的东西。如果不会的请自行百度,如果只想了解支配树在DAG上的姿势请戳这里

那么在学习了 d o m i n a t o r dominator dominator t r e e tree tree 过后,我们继续解决这道题吧。

我们从 0 0 0分算法开始分析

0 0 0分算法:

随便写一个瞎暴力(略)

15 15 15分算法:

我们显然可以 O ( n 2 ) O(n^2) On2建图,枚举终点和断点 i , j i,j i,j,再暴力判断断掉 j j j后是否存在 1 − > i 1->i 1>i的路径

30 30 30分算法:

15 15 15分算法进行优化,构图仍然可以 O ( n 2 ) O(n^2) On2,我们只需改改统计必经点个数的算法,怎么做呢?

我们直接枚举必经点 j j j,然后直接从起点 s s s开始 d f s dfs dfs,将没有访问到的点的答案个数加 1 1 1即可。

50 50 50分算法:

如果我们沿用前两种算法,计算答案的时间显然太长了,而且经过尝试我们不难发现不能使用 t a r j a n tarjan tarjan算法来统计,这个时候我们就要用到我们刚刚补充的 d o m i n a t o r dominator dominator t r e e tree tree了,这样我们可以拿到 50 50 50分了

100 100 100分算法?

不难想到要改变建图的方式来改进时间效率:由于题目中有限制: i , j i,j i,j之间连边当且仅当 i < j i<j i<j L i ≤ A j ≤ R i Li \le Aj\le Ri LiAjRi,如果我们改变枚举建边的顺序,倒序从 n − > 1 n->1 n>1建边,那么如果我们用主席树维护限制的区间 [ L i , R i ] [Li,Ri] [Li,Ri],将 A i Ai Ai看做是“单点修改”的值进行修改。

由于我们使用了主席树来维护,所以并不会有 M L E MLE MLE这种事情发生。
那么假如现在要向 T i , L , R T_i,L,R Ti,L,R中加入一个 j j j,那么我们需要把 P i , L , R P_i,L,R Pi,L,R连接到 j j j,同样的,我们还需要把 P i , L , R P_i,L,R Pi,L,R连接到剩下的属于 S i , L , R S_i,L,R Si,L,R的节点,又因为我们可以发现 S i , L , R − S i + 1 , L , R = j S_i,L,R−S_i+1,L,R=j Si,L,RSi+1,L,R=j所以我们只需要把 P i , L , R P_i,L,R Pi,L,R连接到 P i + 1 , L , R P_{i+1},L,R Pi+1,L,R,显然原 D A G DAG DAG中的连通性是不会改变的

代码

你可能感兴趣的:(#,线段树,#,支配树)