hdu_5683_zxa and xor(非正解的暴力)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5683
题意:
问题描述
zxa最近对按位异或(exclusive disjunction)产生了极大的兴趣,为此他拿出了一个长度为n的非负整数序列a1,a2,⋯,an。 zxa觉得这样太单调了,于是他定义了一种方法funct(x,y),表示将ax不可逆转地修改为y后计算⊗1≤i<j≤n(ai+aj)作为该方法的返回值。 zxa很好奇,如果他对这个序列调用m次这样的方法,那么每次得到的返回值分别是多少,你能帮助他吗? 提示:⊗1≤i<j≤n(ai+aj)即(a1+a2)⊗(a1+a3)⊗⋯⊗(a1+an)⊗(a2+a3)⊗(a2+a4)⊗⋯⊗(a2+an)⊗⋯⊗(an−1+an)。
输入描述
第一行有一个正整数T,表示有T组数据。 对于每组数据: 第一行有两个正整数n和m。 第二行有n个非负整数,表示a1,a2,⋯,an。 接下来m行,第i(1≤i≤m)行有两个非负整数x和y,表示第i调用的是funct(x,y)。 每一行相邻数字之间只有一个空格。 1≤T≤1000,2≤n≤2⋅104,1≤m≤2⋅104,0≤ai,y≤109,1≤x≤n,1≤∑n,∑m≤105
输出描述
对于每组数据,输出m行,第i(1≤i≤m)行包含一个非负整数,表示第i次调用方法的返回值。
输入样例
1 3 3 1 2 3 1 4 2 5 3 6
输出样例
4 6 8
Hint
第一次操作后序列为{4,2,3},(4+2)⊗(4+3)⊗(2+3)=4。 第二次操作后序列为{4,5,3},(4+5)⊗(4+3)⊗(5+3)=6。 第三次操作后序列为{4,5,6},(4+5)⊗(4+6)⊗(5+6)=8。
题解:在BC的终测 我居然TLE了,不科学,唐老师放宽了时限,和我写法差不多,常数也差不多的都过了,然而我没过,很是不爽,然而在OJ上提交 5600+ms A C
1 #include<cstdio> 2 #define FFC(i,a,b) for(int i=a;i<=b;i++) 3 int s[20010],da[20010]; 4 int main(){ 5 int t,m,n,a,b; 6 scanf("%d",&t); 7 while(t--){ 8 scanf("%d%d",&n,&m); 9 FFC(i,1,n)scanf("%d",&s[i]); 10 FFC(i,1,n){ 11 int ans=0; 12 FFC(j,i+1,n)ans=ans^(s[i]+s[j]); 13 da[i]=ans; 14 } 15 FFC(i,1,m){ 16 scanf("%d%d",&a,&b); 17 int tmp=s[a]; 18 s[a]=b; 19 int ans=0,aans=0; 20 FFC(j,a+1,n)ans=ans^(b+s[j]); 21 da[a]=ans; 22 FFC(j,1,a-1)da[j]=da[j]^(s[j]+tmp),da[j]=da[j]^(s[j]+b); 23 FFC(i,1,n)aans^=da[i]; 24 printf("%d\n",aans); 25 } 26 } 27 return 0; 28 }