转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
A:当时是暴力水过的,正解O(n)
如果存在b的某个排列使得 for_each( ai^x=bi )
那么我们将a1^x^b1^a2^x^b2……an^x^bn=0 ,我们在两边再同时^x
由于n为奇数,左边总共便有了偶数个x,抵消
变成a1^a2^……an^b1^b2……^bn=x
好喵,到了这里就解决了,将所有的a,b异或之后,再判断x是否为解
B:给出3个点(x1,y1),(x2,y2),(x3,y3),可以得到三角形面积abs((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1))/2
显然和奇偶性有关,枚举六个数的奇偶性,然后判断
ans=(ans+((x1&1)?(n/2):((n+1)/2))%MOD*((x2&1)?(n/2):((n+1)/2))%MOD*((x3&1)?(n/2):((n+1)/2))%MOD*((y1&1)?(m/2):((m+1)/2))%MOD*((y2&1)?(m/2):((m+1)/2))%MOD*((y3&1)?(m/2):((m+1)/2)))%MOD;
C:当时是记忆化搜索过的,直接广搜也行
D:感觉好神的题目,思维跟不上。
可以得到这个式子,v(A)=∏a∈A(1+a)−∏a∈A(1−a)2
这个式子,刚好能把偶数项的抵消。。。
然后就是分别维护两部分就行了,求一下逆元什么的。貌似数据是multiset吧
E:状态压缩DP,dp[i]表示已经取的数的状态为i时的部分和。
s[i]表示i转换为二进制后1的个数,那么下一个数取的便是a[s[i]][j]。
for(int i=0; i<(1<<n); i++) { for(int j=0; j<n; j++) { if(i&(1<<j)) continue; dp[i|(1<<j)]=(dp[i|(1<<j)]+dp[i]*a[s[i]][j])%m; } }
那么给出一条路径,长度为X,(X>2),我们考虑他的两端,可能全为1,可能也有2,如果把边权为2的边删掉,或者把两端边权为1的都删了,那么必然存在一条长度为X-2的边。
这便说明,只要找到长度为奇数的最大值up[1],以及长度为偶数的最大值up[0]。小于up[1]的奇数肯定存在,小于up[0]的偶数肯定存在。太神了,否则瞬间变神题
Tree_DP一次求出up[0],up[1]就行了
G:式子可以转换成C[k]=(A[1]+A[2]+⋯+A[k])⋅B[k]+(B[1]+B[2]+⋯+B[k])⋅A[k]−A[k]⋅B[k]
或者维护部分和,然后再枚举
H:带花树或者Tutte matrix算法,先留个坑。
I:tree_dp求一下子树的大小,如果是偶数就ans+1
J:数据水了,树DP+背包可以水过,对于链的数据会完T
考虑联通块不包括重心,则最多只能有n2的大小。于是就算包含重心的联通块的最小权值,有一个熟知的动态规划算法可以做到O(N2)。之后点分治即可。复杂度仍然是O(N2)。
"熟知的动态规划算法"可以参见何森的集训队论文。
-----ftiasch