标签:指针 case tps 直接 个性 拓扑排序 轻松 log 允许
该面对的还是要面对啊。
写着 luogu 题号、放着 uoj 链接,我也不知道我是什么心态。
极差问题的套路是固定最小值然后取找最优的最大值。
在这道题考虑从权值入手,将所有的 \(a_i\), \(b_i\) 拿出来排序为一个面值序列,固定一个最小值然后贪心的扩展最大值,也就相当于确定了某些面值一定在背面,容易发现确定的面值是面值序列左端和右端连续的两段。
同时限制有两个:
可以通过双指针解决。复杂度决定于排序,为 \(\mathcal O(n\log n)\)。
看起来像一个差分约束、网络流或者是构造,我怎么没往差分约束去想啊。
每个限制 \(a_{i,j}+a_{i,j+1}+a_{i+1,j}+a_{i+1,j+1}=b_{i,j}\) 有 \(4\) 个未知元,没有办法直接入手。那么先不管 \(0\le a_{i,j}\le 10^6\) 的限制,很容易吓构造一个只满足 \(b_{i,j}\) 限制的矩阵 \(a‘_{i,j}\)。
然后我们要调整它,观察到一个性质,对于某一行 \(i\),奇数列加上 \(\Delta x\),偶数位减去 \(\Delta x\),整个矩阵仍然满足 \(b_{i,j}\) 的限制。
对每一行每一列加入如此限制,在错一下位,于是我们可以构造出这样的 \(nm\) 个限制:
这样就是经典的差分约束模型了,跑 SPFA 得到 \(r_i\), \(c_j\) 的合法解即可。
每组数据复杂度 \(\mathcal O(n^3)\),认为 \(n,m\) 同阶。
uoj 的 hack 数据太过分了。由于这是一张完全图,不需要建图,用邻接矩阵存边权,减少一些不必要的清空才能过。将 SPFA 改成 Bellman-Ford 可以内存访问连续,减小一些常数。
网上有很多 \(\mathcal O(n^3)\), \(\mathcal O(nm\log m)\) 的做法,感觉很不靠谱。
考虑 \(f(u,G)\) 的真正含义,就是对图 \(G\) 统计有多少个 \(v\) (\(v\le u\))满足 \(u\) 到 \(v\) 的路径和 \(v\) 到 \(u\) 的路径经过的点的最小编号 \(\ge v\)。
反过来考虑 \(v\) 对 \(f(u,G)\) 的贡献,那么只要每次保留 \([v,n]\) 的点和相关的边,判断强连通性即可。
那么对于每个 \(u\):保留 \([u,n]\) 的点,求出 \(u\) 到 \(v\) 的路径和 \(v\) 到 \(u\) 的路径经过的边的最小编号为 \(low(v)\),那么点对 \((u,v)\) 对于图 \(G_1\dots G_{low(v)-1}\) 都有贡献,可以差分优化这个前缀加。
这个 \(low(v)\) 有人暴力 Dijkstra 或者 Floyd 求,我感到不能容忍。我们倒着加边,并且只加 \([u,n]\) 的点相关的边,每加一条边 \((x,y)\),考虑它的影响,如果 \(x\) 被更新过而 \(y\) 没有,那么从 \(y\) 开始 bfs 所有没被更新过的点,这些点的 \(low\) 值就是该边编号,因为这条边是目前图中编号最小的。为了保证复杂度,每条被访问过的边都应该及时删掉,这样每条边加入和删除都至多 \(1\) 次,复杂度 \(\mathcal O(m)\)。总复杂度 \(\mathcal O(n(n+m))\)。
不过似乎不是出题人所想的正解,在官方数据下跑的巨慢。
还有 \(\mathcal O(\dfrac{n^3}{w})\) 的做法,先咕。
先考虑链的做法,在扫描的时候维护一个 \(last(c)\) 表示颜色为 \(c\) 出现最晚的点,从而找到每个点的匹配前驱,由此可以构建倍增数组。
放到树上,dfs 的时候维护 \(last(c)\) 也是轻松的。然后把每次询问的一条链拆成上行的下行两条链,上行的部分就可以直接倍增了;而下行发现不能同样这么做,因为我们不知道匹配的终点在哪里。不过我们发现了单调性,如果匹配终点之前的点往上跳,同样可以与上行的链相衔接,而匹配终点后面的不行。二分匹配终点后倍增判断即可。
复杂度 \(\mathcal O(n\log n+q\log n\log c)\)。
为什么我没去想状压啊。
首先如果我们确定了最后的排名,那么每次贪心地让 \(b_i\) 尽量小是最优的。
然后考虑状压 DP,我们需要知道的是某个时刻有哪些人出现在榜上,这些人 \(b_i\) 的和,最后出现的人是谁,这个人 \(b_i\) 是多少,即 \(f(S,W,x,w)\),这样就设出了 \(\mathcal O(2^nnm^2)\) 的状态。
进一步优化,从最后一个人的 \(b_i\) 入手,我们知道合法的状态 \(b_i\) 单调不降,且 \(\sum_ib_i\le m\)。原本我们计算 \(b_i\) 需要知道上一个人的 \(b_{i-1}\) 是多少,那么考虑费用提前计算,因为我们只关心最后的 \(\sum_ib_i\) 是多少。观察 \(b_{i-1}\) 到 \(b_i\) 的变化量,最后一个人从 \(x\) 到 \(y\) 变化量为 \(\max\left\{a_x-a_y+[x<y],~0\right\}\),\(y\) 对总和的贡献就是 \((n-|S|)\times(b_i-b_{i-1})\)。于是可以去掉第四维。
现在可以做到 \(\mathcal O(2^nnm)\) 的状态量,加上转移,DP 总复杂度 \(\mathcal O(2^nn^2m)\)。
虽说是一道科技题,但是我认为出题人的真正意愿是让我们根据图上的支配关系的各种性质想到“支配树”这种结构的,况且这道题允许较为好想的 \(\mathcal O(n^2)\) 建树的。
约定:\(D_u\) 为 \(u\) 的受支配集;\(fa_u\) 是支配树上 \(u\) 的父亲;\(x\to y\) 代表 \(x\) 到 \(y\) 的一条有向边;\(x\rightsquigarrow y\) 代表 \(x\) 到 \(y\) 的一条路径。
首先图上点之间的支配关系是形成树形结构的,支配树大概有这些性质:
可以根据这些性质来构建支配树。我们删掉点 \(x\) 后 \(1\) 不能够到达的点集就是支配树上 \(x\) 的子树,由此可以得到每个点的受支配集,然后类似拓扑排序的方法构建支配树。复杂度 \(\mathcal O(n^2)\)。
询问时,加入一条边 \((x,y)\) 可能会让根到某些点的路径变多,那么受支配集一定是不增的。假设某个点 \(u\) 增加了路径 \(1\rightsquigarrow x\to y\rightsquigarrow u\),那么 \(u\) 受支配集改变,当且仅当存在 \(f\in D_u\), \(f\notin 1\rightsquigarrow x\to y\rightsquigarrow u\)。我们要找到深度最小的点 \(u\) 满足 \(f=fa_u\),并且容易证明这个点的子树的支配集都会改变。
因为 \(fa_u\notin 1\rightsquigarrow x\to y\rightsquigarrow u\),那么就要求两个条件同时成立:
每个询问暴力判断,然后做一个树上差分即可。复杂度 \(\mathcal O(qn)\)。
注意常数,每次询问不要直接 dfs,用 dfs 序模拟。
标签:指针 case tps 直接 个性 拓扑排序 轻松 log 允许
原文地址:https://www.cnblogs.com/renamoe/p/14772205.html