考试心态又炸了,就像达哥那套周任飞一样,T1调到手抖,T2暴力打错没时间拍,T3测试点分治把自己给分治懵了,最后只拿到了链的24分
T1
做过此类题的可以很容易想到差分,复杂度O(nq),显然是过不去的。
所以要优化差分,我们发现差分长这样:|
所以便可以分别维护两个差分,递推出当前点的差分,复杂度O(n^2)。
注意数组开2倍
T2
数据范围n<=30显然是道搜索题,加上记忆化可以拿到65分。
用hash存储状态即可。题解说状态数最大值是Fibonacci前n+1项和,然而我不会证。
T3
性质1:操作之间无交集
性质2:前后颜色一样的一定不反转,不一样的一定反转。
性质3: 对于一个操作的边集S,路径条数为奇数点个数/2,路径和为|S|。
首先用一个二元组(c1,c2)代表奇数点个数为c1,路径和为c2。
先考虑子树的合并:
设x为当前节点,y为x的儿子
设w0/1为子树中伸/不伸上来一条边的二元组。
初始化:
w0=(0,0),w1=(INF,INF);
w0=min(w0+f[y][0],w1+f[y][1]);
w1=min(w1+f[y][0],w0+f[y][1]);
然后考虑更新x的值
f[x][0]代表x头上不反转,1代表反转。
f[x][0]=min((w1.c1+1,w1.c2),w0);
f[x][1]=min((w1.c1,w1.c2+1),(w0.c1+1,w0.c2+1));
如果x头上的边是一定的,那就把不合法的赋值成INF即可