Codeforces Round 717(Div.2)
A、Tit for Tat
题意:
给你一个序列$a$和$k$次操作,每次操作选择$i$和$j$$(i \neq j)$两个元素,然后$a_i+=1$,$a_j-=1$,并要求操作完成后序列的数均为非负。求至多$k$次操作之后字典序最小的序列。
题解:
每次选最左边的不为$0$的元素加一就行,直到$k$次用完或者前$n-1$个元素都是$0$。
B、AGAGA XOOORRR
题意:
给你一个序列,每次选择两个相邻的数,删除它们并插入它们的异或,问你能不能构造出长度大于$1$,且所有序列中剩下的值一样的序列。
题解:
直接求序列异或和,如果是$0$,直接输出$YES$,否则看看有几个区间的异或和是序列的异或和,如果大于$1$则输出$YES$,否则输出$NO$。
C、Baby Ehab Partitions Again
题意:
给你一个序列,问你最少删几个数,使得剩下的序列中不能划分成两个和一样的子序列
题解:
先求序列和,如果是奇数,不用删就行,否则跑可行性背包$dp$,然后如果$\frac{sum}{2}$不能构造出来,也不用删,否则先求一趟区间$gcd$,然后使得序列中的数都除这个区间$gcd$,删掉任意一个奇数即可。
D、*Cut
题意:
给你一个长度$1e5$的序列和$1e5$次询问,每次询问输出$[l, r]$中最少有多少个子区间,每个子区间的$LCM(a_{l_1}, a_{l_1+1}.....a_{r_1})=\prod(a_{l_1}, a_{l_1+1}.....a_{r_1})$。
题解:
首先预处理出每一个数到它右边并且和它互质的最右位置,然后对于这个数,它到它的最右位置就是以它为左端点的区间,如果倒着做,每次先继承后一个数的状态,然后取它的因数的最左的那个,作为它的最右位置,就可以保证某个数所在的区间一定互质。然后倍增,求某个数后面第$2^i$个区间的右端点的位置,查询时倍增即可,结果要加上$1$,因为上面的区间都是左闭右开定义的。