D2T1
- 似乎可以用spfa/floyd,按管制时间从晚到早的顺序加进去,每次都更新一下。
D2T2
-
先二分出第KKK大的值,然后在找出所有距离小于这个值的点对的距离。
-
全程可以用二维偏序解决。
D2T3
- 考虑建出笛卡尔树然后在上面分治。
- 直接边分治的话比较暴力,考虑用一下奇技淫巧尽量让A每输出一个字符就让可能性砍半。
D3T1
- 考虑保留第一个X,最后一个Z,以及它们中间的“YX”(Y和X一定要粘起来)。
- 接着把没有保留的按从左往右的顺序删除,可以发现“YZ”虽然没有被保留,但是这样删依然能让“Y”变成good removal。
- 直接发送是O(n)O(n)O(n)的,考虑只有Cn−iiC_{n-i}^iCn−ii种情况,大概最多刚好7w左右,所以压一压就能过了。
D3T2
- 考虑把所有人分成两类:从左往右和从右往左。
- 接着设一个DP表示f[i][j]f[i][j]f[i][j]表示你现在走到从左往右的第iii个人和从右往左的第jjj个人。
- 显然在他们相遇的时候再转换方向。
- 但有一个特殊情况:你有可能掉头去找一个跟原来的人同方向的人。
- 这时候你就需要新建虚空人,贡献为000,这样子就可以顺利转移了。
D3T3
- 直接长链剖分就完了。
D4T1
- 考虑贪心从小到大取。
- 判断合法性就可以先按区间左端点排序,然后倍增判断是否会让答案小于KKK。
D4T2
- 你知道9个位置的数,其中7个位置表示7个目标点的信息,1个用来表示它们是哪个目标点,还有1个好像可以把发送的数字压缩到12。
D4T3
- 据说线段树合并就完了。