數據結構 elegant_sequence(優雅的序列)
阿新 • • 發佈:2017-09-23
ant 偶數 記錄 leg else 輸入 prim .com 整數
數據結構 elegant_sequence(優雅的序列)
問題描述
如果一個序列的元素的異或和等於 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 14scanf("%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 }
數據結構 elegant_sequence(優雅的序列)