1. 程式人生 > >數據結構 elegant_sequence(優雅的序列)

數據結構 elegant_sequence(優雅的序列)

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     
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 }

數據結構 elegant_sequence(優雅的序列)