问题描述
如果一个序列的元素的异或和等于 1,我们称这个序列为优雅的序列。现在
给你一个 01 序列,和 m 次询问。对于每次询问,给出 l,r。请你输出子序列 a[l..r]
的异或和。
★数据输入
输入第一行为正整数 n, m。
第二行为 n 个正整数 a[1..n]。 (1<=ai<=10^9)
接下来的 m 行,每行两个数 l,r。 (1<=l<=r<=n)
80%的数据 1<=n,m<=1000.
100%的数据 1<=n,m<=100000.
★数据输出
输出 m 行,每行一个数表示 a[l…r]的异或和。
输入示例 | 输出示例 |
3 6 1 1 0 1 1 1 2 1 3 2 2 2 3 3 3 |
1 0 0 1 1 0 |
★Hint
数列下标从 1 开始。
解题思路
奇数个1的异或和为1,偶数个1的异或和为0
类似 [coprime_sequence(互质序列)](http://www.cnblogs.com/cbattle/p/7577344.html),用数组记录中间值
********************************************************************************
写完后发现之用算从左到右的值存入left[] ,L到R的异或和为left[R]-left[L-1]
********************************************************************************
code
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int p[100002]; 5 int left[100002]={0}; 6 int right[100002]={0}; 7 8 int main() 9 { 10 int i,j; 11 int len,ask,l,r; 12 int onenum=0; 13 14 scanf("%d %d",&len,&ask); 15 for(i=1;i<=len;i++) 16 { 17 scanf("%d",p+i); 18 if(p[i]==1) onenum++; 19 } 20 21 for(i=1;i<=len;i++) 22 { 23 if(i==1) 24 left[i] = p[i]; 25 else 26 left[i] = left[i-1] + p[i]; 27 } 28 for(i=len;i>=1;i--) 29 { 30 if(i==len) 31 right[len] = p[len]; 32 else 33 right[i] = right[i+1] + p[i]; 34 } 35 // for(i=1;i<=len;i++) printf("%d ",p[i]); printf("\n"); 36 // for(i=1;i<=len;i++) printf("%d ",left[i]); printf("\n"); 37 // for(i=1;i<=len;i++) printf("%d ",right[i]); printf("\n"); 38 for(i=0;i<ask;i++) 39 { 40 scanf("%d %d",&l,&r); 41 int num; 42 if(l==1) 43 num = onenum - right[r+1]; 44 else if(r==len) 45 num = onenum - left[l-1]; 46 else 47 num = onenum - left[l-1] - right[r+1]; 48 49 printf("%d\n",num%2); 50 } 51 52 return 0; 53 }
时间: 2024-10-29 02:01:47