@SovietPower
2018-12-30T20:28:47.000000Z
字数 2229
阅读 1382
正睿OI
考虑两个数异或怎么会得到1:,也就是同一位的两个1会抵消成0。那么令表示的二进制1的个数,如果计算只奇偶性,。因为如果有变成0的1也一定是两个一起变成0。那么如果令表示区间中为偶数的的个数,表示区间中为奇数的的个数,该区间的答案为。
计算,可以数位DP。,考虑中的怎么求。对于一个偶数,一定与奇偶性相反。于是我们这样分组:奇偶性是这样的:可得:
计算覆盖的格子,如果不考虑交叉,单独算主对角线(向右斜的统称主对角线了)与副对角线(所有向左斜的)的话很容易。那先算出这个的答案。
考虑主次对角线交叉的部分,我们枚举每条次对角线,看它与哪些主对角线有交点,这是一个区间,那么好像可以二分。
而如果以x=y这条对角线为边界的话,确实可以二分两次来确定这个区间。
但是交点是指在格点上相交。这相当于两条直线的交点有整数解。但是可以发现每相邻两条副对角线,它们在格点上有交点的主对角线是正好互斥的。
再观察下,然后可以分奇偶性,求前缀和就行了。
但是不需要二分,因为我们可以O(1)计算出区间位置,然后前缀和。
分奇偶性的话前缀和从i-2转移就行了。把坐标系旋转45°找规律会更方便些。
有一个只有一条边有权值的部分分,对于某种位置分布情况,我们肯定是在这条边两侧尽量配对。
这样扩展到每一条边,如果它两边能配对,我们应尽量让两边的配对,多走这条边的路,即一定会增加。
那么我们可以对每一条边计算其贡献。枚举它一边男女生人数就可以得到所有情况。设它某一边连通块点数为,则边的贡献为:
一个环删掉一段,剩下的一段也是连续的。它当中不含有相邻的相同字符。如果原串中存在相邻的相同字符,则在这里把环切开,最后会把环切若干段,合法的剩下的段显然是某一段的一部分。
然后判断在合法的段中是否有长的合法长度(若存在,则删个是可以的),即长首尾字母不同的段。而再删一段后首尾字母相同就是一段前后缀相同。判断前后缀是否相同可以直接用KMP/Hash。如果有长为的相同前后缀长度,则位置是非法的。拆环为链每次只删后缀就是正确的了。
如果不存在相邻的相同字符,把整个串求一遍就行了。