首先注意到修改只有立方并且模数非常小!
于是可以只维护每个数被修改的次数然后倍增得到实际值。
然后感觉这种题就有某个结论,可以把某些区间直接判成有解。
那就来猜下这个结论。
首先如果有相同的数肯定有解,所以 r−l+1>v 就有解了(逃
显然并没有什么用。
假设某个区间 [l,r] 内无解,则所有 2r−l+1 个子集的贡献都不同。
然而贡献最多只能到 v(r−l+1),所以若 2r−l+1>v(r−l+1) 则一定有解。
故 r−l+1>13 时有解。
然后考虑一个能跑 r−l+1≤13 的算法。
可以考虑 DP,设 fi,j 表示前 i 个数中能不能选出一个总贡献为 j 的子集。
如果对于某个 i 有 fi−1,j 和 fi−1,j−a−i−1 都为 1 则意味着有解,因为给后一个状态选出的集合添上一个 i 就相等了。
转移也类似。
看起来跑不动……?
注意到全是 0,1,bitset 走起。
代码:
1 |
|