1.Tree Rotations
从下至上贪心选择是否交换两棵子树,需要维护两棵子树交换以及不交换的逆序对数。
可以使用平衡树的启发式合并和线段树合并。
2.Lightning Conductor
把式子改写成f[i]=f[j]+w[i,j],注意到w满足四边形不等式(要用double,因为sqrt取整以后不满足四边形不等式),应用决策单调性的优化方式,正反做两遍即可。
3.Temperature
对于一段连续的区间最高温度贪心选最低,用这个温度向后DP就行。用单调队列维护这个过程。
4.Lollipop
需要发现一个性质,如果S能取到,那么S-2必定能取到,所以先把数列全加起来得到一个值P,再贪心选一个奇偶性不同于P的Q,往回推下来就行。
5.Party
设V为顶点集合,每次找到在V中的两个点s,t,使得<s,t>∉E,把s,t从V中删去,这样的操作进行最多不超过n/3次,最多删掉2n/3个点。剩下的n/3个点就是答案。
6.Strongbox
这题真是厉害啊……
首先定义密码集合D,如果x∈D,y∈D,那么gcd(x,n)∈D,gcd(x,y)∈D,这个用裴蜀定理能证。
于是我们就知道了密码集合肯定是d、2*d、3*d这样的,其中d|n。这样里面就有n/d个数,就是说要最小化d。
但是还有k-1个限制,意思就是设D={d1,d2,d3,...,dl},不能有x1*d1+x2*d2+x3*d3+...+xl*dl=ai (mod n),这个用裴蜀定理看一下就是d不能整除gcd(n,d1,d2,d3,...,dl)。这里l<k。
现在又有d|gcd(ak,n),于是我们把所有gcd(ak,n)的约数列出来,把所有ai的约数删掉,也就是把所有gcd(ai,ak,n)的约数删掉。
先给列表中所有gcd(ai,ak,n)打上删除标记,然后从大到小枚举约数列表中的数,暴力枚举倍数,如果有一个倍数被删了,这个数也要被删。
这样还过不了,枚举倍数的时候实际上不用全枚举,可以只枚举gcd(ak,n)的素因数,这样任何一个数都可以被它的倍数找到并删除,复杂度就能够保证了。
7.Sticks
所有的从小到大排序,从小到大找,每次寻找两个最长的与当前颜色不同的两个木棍,这个用priority_queue乱搞一下就可以了。
8.Meteors
整体二分,中间有的地方好像爆long long。
9.Conspiracy
这题也挺厉害……
首先假如我们找到了一个合法方案,那么怎么找出全部合法方案呢?
肯定不会有两个同在团中或者同在独立集中的点同时能够改变所在的阵营,这样也就是说有三种情况:
(1)一个团中的点进入独立集
(2)一个独立集中的点进入团
(3)一个独立集中的点与一个团中的点互换了
记录一下每一个点的度数,对三种情况分别讨论,每一种都可以用O(1)的时间判断新的解是否合法。这样如果我们有了一个可行解,就能在O(n^2)内找到所有解。
怎么找初始解呢?这是一个2-SAT问题(膜拜jry的博客),构造一个……