题目连接: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
#include<cstdio>
#define FFC(i,a,b) for(int i=a;i<=b;i++)
int s[20010],da[20010];
int main(){
int t,m,n,a,b;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
FFC(i,1,n)scanf("%d",&s[i]);
FFC(i,1,n){
int ans=0;
FFC(j,i+1,n)ans=ans^(s[i]+s[j]);
da[i]=ans;
}
FFC(i,1,m){
scanf("%d%d",&a,&b);
int tmp=s[a];
s[a]=b;
int ans=0,aans=0;
FFC(j,a+1,n)ans=ans^(b+s[j]);
da[a]=ans;
FFC(j,1,a-1)da[j]=da[j]^(s[j]+tmp),da[j]=da[j]^(s[j]+b);
FFC(i,1,n)aans^=da[i];
printf("%d\n",aans);
}
}
return 0;
}