20171017/20171018
10.17
T1是个数论题,弄出来了一堆结论(题解说这很显然,然而我并不明白),然后就可以直接筛了
T2,在考试的时候我想到了正着推去找到每一个元素的时候的有1的个数,我是直接弄了一个结构体来存每一个点1的个数的上下界,但是没有关注到XOR得到的1的个数范围不是连续的,而是跳着的,而且我没有成功的逆转退回去,就是没有找到一个方案能有条理的逆推; 正解是f[i][j]表示执行到第i位的时候,有j个1的可行性,然后再记录一下f[i][j]是从哪里转移过来的,然后再逆推的时候就可以向求出一共有多少个位置都两者都需要 1 然后再依次放就行了
T3是个树归,自己主要是没有太想明白等于的时候怎么转移,我觉得是有一个关键的节点我没有注意到,就是如果等于的话,他只能有一条路径是满足的,也就是说,再寻找等于的时候,要么就是存在唯一一个点等于,然后可以继续dfs下去,要么就是不等于,小就可以直接统计方案数,大就是直接return,再统计的时候,式子可以消掉一部分使方案数与本身那个点无关,然后可以用树状数组来差分一下每一个son的排名直接计算就好了
10.18
T1,KMP裸题
T2,其实就是求割点,满足使1,n不在一个联通块里(我居然没有考虑这个东西),那么我们考虑从1开始tarjan,那么只要保证n再割点一下就行了,那么我们就可以用时间戳来记录n是什么时候访问到的,只要小于回来是的stp并且>=dfn[v]就说明他在底下的块里;
T3,其实就是一个模拟的过程(想着想着就忘了他是一个环),我们把这个环变成加长一倍的链,然后卡一个长度为n的序列,是其中的B都到两边,这里面一定存在最优方案,那么把一个点移动到左边的步数就是他左边R的个数,所以要把B移到两边,找到有一半R的个数分界点,左边的去左边,右边的去右边,再移动两个卡区间的指针的时候,可虑贡献的变动就行了