hdu_5683_zxa and xor(非正解的暴力)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5683

题意:

 

问题描述
zxa最近对按位异或(exclusive disjunction)产生了极大的兴趣,为此他拿出了一个长度为nn的非负整数序列a_1,a_2,\cdots,a_na1,a2,,an。

zxa觉得这样太单调了,于是他定义了一种方法funct(x,y)funct(x,y),表示将a_xax不可逆转地修改为yy后计算\otimes_{1\leq i < j\leq n}{(a_i+a_j)}1i<jn(ai+aj)作为该方法的返回值。

zxa很好奇,如果他对这个序列调用mm次这样的方法,那么每次得到的返回值分别是多少,你能帮助他吗?

提示:\otimes_{1\leq i < j\leq n}{(a_i+a_j)}1i<jn(ai+aj)(a_1+a_2)\otimes(a_1+a_3)\otimes\cdots\otimes(a_1+a_n)\otimes(a_2+a_3)\otimes(a_2+a_4)\otimes\cdots\otimes(a_2+a_n)\otimes\cdots\otimes(a_{n-1}+a_n)(a1+a2)(a1+a3)(a1+an)(a2+a3)(a2+a4)(a2+an)(an1+an)
输入描述
第一行有一个正整数TT,表示有TT组数据。

对于每组数据:

第一行有两个正整数nnmm。

第二行有nn个非负整数,表示a_1,a_2,\cdots,a_na1,a2,,an。

接下来mm行,第i(1\leq i\leq m)i(1im)行有两个非负整数xxyy,表示第ii调用的是funct(x,y)funct(x,y)。

每一行相邻数字之间只有一个空格。

1\leq T\leq 1000,2\leq n\leq 2\cdot10^4,1\leq m\leq 2\cdot10^4,0\leq a_i,y\leq 10^9,1\leq x\leq n,1\leq\sum{n},\sum{m}\leq10^51T1000,2n2104,1m2104,0ai,y109,1xn,1n,m105
输出描述
对于每组数据,输出mm行,第i(1\leq i\leq m)i(1im)行包含一个非负整数,表示第ii次调用方法的返回值。
输入样例
1
3 3
1 2 3
1 4
2 5
3 6
输出样例
4
6
8
Hint
第一次操作后序列为\{4,2,3\}{4,2,3}(4+2)\otimes(4+3)\otimes(2+3)=4(4+2)(4+3)(2+3)=4。

第二次操作后序列为\{4,5,3\}{4,5,3}(4+5)\otimes(4+3)\otimes(5+3)=6(4+5)(4+3)(5+3)=6。

第三次操作后序列为\{4,5,6\}{4,5,6}(4+5)\otimes(4+6)\otimes(5+6)=8(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 }
View Code

 



 

posted @ 2016-05-14 22:19  bin_gege  阅读(214)  评论(0编辑  收藏  举报