ACdream群原创群赛(3)

转载请注明出处,谢谢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)=aA(1+a)aA(1a)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;
    }
}

F:充分利用题目给的一个条件,边权只能为1或者2

那么给出一条路径,长度为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






你可能感兴趣的:(ACdream群原创群赛(3))