2022/2/17 思考。
其实是 Solution Set.
「GXOI / GZOI2019」旅行者
显然考虑超源超汇一类东西。要找到一些染色方法使得所有 \(\forall (u,v),u \neq v,c_u = 1,c_v = 0\) 都被包含。
这个可以说是典中典,枚举二进制下每一位是 \(1\) 还是 \(0\),第一次是 \(1\) 的位置的点连源点,第二次连汇点,跑 \(O(2\log k)\) 次 Dijkstra。
那么时间复杂度是 \(O(T n \log m \log k)\) 的。
「SDOI2019」热闹的聚会与尴尬的聚会
好长的名字。
我们钦定这个出题人不会造数据。我们先随便搞出一个比较优秀的尴尬的聚会,求出一个热闹的聚会的 \(p\) 的下界。
我们先假设选出所有点,如果还不满足就删去度数最小的点。在单求热闹的聚会的 \(p\) 最大值这样做可以 \(O(n \log n)\)……但是没必要,毕竟你已经钦定这个数据很水了。事实上确实是那个确实。
「LOJ 508」失控的未来交通工具
由裴蜀定理可知,有 \(a_1,a_2,\cdots ,a_k\),对每个 \(a_i\) 赋上一个系数 \(b_i \in \Z\) 算 \(\sum a_ib_i\),那么仅能构出为 \(\gcd(a_1,a_2,\cdots a_k)\) 的倍数的数。
注意要动态加边,同时要动态找环一堆东西。不妨先对每个连通块钦定一个根构成一个树,不难发现是并查集维护。那么要在并查集维护当前结点到树根的距离(这个需要在路径压缩的时候顺便处理掉才能保证复杂度),并且根据裴蜀定理我们可以对每一个连通块维护一个 \(C\) 表示可以构出所有以 \(C\) 为倍数的权值。
好那么分讨,先考虑加边。首先一个边可以看成一个环,那么 \(C \gets \gcd(C,2w\bmod m)\)。
然后如果连的边在同一个连通块,那么构成了一个新的环长度为 \((d_u+d_v+w) \bmod m\)。跟上面一样的处理方法。
否则的话要合并两个所属连通块,就假设把 \(u\) 并到 \(v\) 上面去吧。首先距离要更新,因为我们用了并查集所以只需要改连通块 \(u\) 的根的距离,\(C\) 的话显然 \(C_{V} \gets \gcd(C_{U},C_{V})\)。
然后考虑查询。如果无法到达输出 \(0\),如果 \(b\) 是 \(0\) 特判一下。然后剩下的工作非常的傻逼做个 exgcd 啥事儿没有。