传送门
首先这题我们要用到一个叫做支配树( 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) O(n2)建图,枚举终点和断点 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) O(n2),我们只需改改统计必经点个数的算法,怎么做呢?
我们直接枚举必经点 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 Li≤Aj≤Ri,如果我们改变枚举建边的顺序,倒序从 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,R−Si+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中的连通性是不会改变的
代码