1. 程式人生 > >CSU - 1770 按鈕控制彩燈實驗

CSU - 1770 按鈕控制彩燈實驗

簡單 sam 無聊 rom 變化 gets blog 開心 內容

應教學安排,yy又去開心的做電學實驗了。實驗的內容分外的簡單一串按鈕通過編程了的EEPROM可以控制一串彩燈。然而選擇了最low的一種一對一的控制模式,並很快按照實驗指導書做完實驗的yy馬上感覺到十分無趣。於是他手指在一排按鈕上無聊的滑來滑去,對應的彩燈也不斷的變化著開關。已知每一個按鈕按下會改變對應一個彩燈的狀態,如此每次yy滑動都會改變一串彩燈的狀態。現已知彩燈最初的狀態,已經yy n次無聊的滑動的起點和終點l,r。現問彩燈最終的狀態。

Input

有多組數據。
每組數據第一行,n(1<=n<=10^5)代表彩燈串長度,t(0<=t<=10^5)代表yy滑動的次數
第二行n個數(0表示滅1表示亮)給出n個彩燈的目前的狀態。
之後t行每行兩個數li,ri(1<=li<=ri<=n)代表每次滑動的區間。

Output

每組用一行輸出最終的串的狀態,格式見樣例。

Sample Input

3 2
1 0 1
1 3
2 3

Sample Output

0 0 1

可以用單個位置的更新模擬出區間更新,詳細見代碼。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 const int maxn=100005;
 9 int c[maxn],g[maxn],n;
10 11 void update(int x,int v) 12 { 13 for(;x<=n;x+=x&(-x)) 14 g[x]+=v; 15 } 16 17 int getsum(int x) 18 { 19 int sum=0; 20 for(;x>0;x-=x&(-x)) 21 sum+=g[x]; 22 return sum; 23 } 24 25 int main() 26 { 27 int m,l,r; 28 while(~scanf("%d%d",&n,&m))
29 { 30 memset(g,0,sizeof(g)); 31 for(int i=1;i<=n;i++) 32 scanf("%d",&c[i]); 33 for(int i=0;i<m;i++) 34 { 35 scanf("%d%d",&l,&r); 36 update(l,1); 37 update(r+1,-1); 38 } 39 /*for(int i=1;i<=n;i++) 40 cout<<c[i]<<" ";*/ 41 printf("%d",(c[1]+getsum(1))%2); 42 for(int i=2;i<=n;i++) 43 printf(" %d",(c[i]+getsum(i))%2); 44 printf("\n"); 45 } 46 47 48 return 0; 49 }

CSU - 1770 按鈕控制彩燈實驗