A. 序列
看到这种奇怪的操作想分块就行了。对于每个块维护一个vector,表示取max的操作序列。由于加法和取max同时操作很难搞,可以考虑把这两个东西分开,就是给max减去加法的标记。于是重构的时候可以给每个点upper_bound就可以得到这个点经过了多少次取max。
B. 旅行计划
首先考虑给联通块内所有边和k同时除掉它们的gcd,最后乘回来。若k是奇数,那么只要在两个点之间走K次就可以了。
考虑K是偶数的情况。在联通块内的边走若干次必然可以使得总路径长度mod k的值增加1,而在联通块内我们可以任意经过一条边偶数次,所以存在一种方案使长度mod k增加2。
所以只要两点之间存在长度为奇的路径,或者说联通块内存在奇环,那么必然可以通过调整路径使答案为0,否则答案为1。
特判一些情况即可。
C. Hack
理解不深刻。。。
如果没有每条路径只经过一次的限制,那么直接最小割即可。
最小割将原来的集合分成了S和T两个集合。假如一种割不合法,那么必然在原图中存在一条路径,从S集合到T集合回到S集合到T,所以只要将这样的路径判掉就可以。
所以考虑将每条边反向边的流量设为正无穷,那么假如存在这样一条路径,从T到S那条边的反向边就会将两部分重新联通,所以不合法。