C - 染我眼角珠泪 CSU - 1770: 按钮控制彩灯实验 树状数组

C - 染我眼角珠泪

 CSU - 1770 

应教学安排,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

Hint

 思路:树状数组。按下L~R的开关一次相当于按下1~L-1的开关两次、L~R的开关一次,每次tree[L-1]+1、tree[R]+1,则对于开关i的状态与按了sum(i)次开关一样。(sum求的是小于等于i的数的个数)

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <malloc.h>
#define Twhile() int T;scanf("%d",&T);while(T--)
#define clc(a,b,n) for(int i=0;i<=n;i++)a[i]=b
#define clc2(a,b,n,m) for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)a[i][j]=b
#define fora(i,a,b) for(int i=a;i<b;i++)
#define fors(i,a,b) for(int i=a;i>b;i--)
#define fora2(i,a,b) for(int i=a;i<=b;i++)
#define fors2(i,a,b) for(int i=a;i>=b;i--)
#define PI acos(-1.0)
#define eps 1e-6
#define INF 0x3f3f3f3f
#define BASE 131
#define lowbit(x) x&(-x)

typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
using namespace std;
const int maxn=1001000+11;
int tre[maxn];
int a[maxn];
void update(int i,int val,int n)//n是树的大小
{
    for(;i<=n;i+=lowbit(i))
        tre[i]+=val;
}
LL sum(int i)
{
    LL ret=0;
    for(;i>0;i-=lowbit(i))
        ret+=tre[i];
    return ret;
}
int main()
{
    int N,T;
    while(~scanf("%d%d",&N,&T)&&N)
    {
        fora2(i,1,N)scanf("%d",a+i);
        memset(tre,0,sizeof(tre));
        int K=0;
        while(T--)
        {
            int L,R;
            scanf("%d%d",&L,&R);
            L++;R++;
            update(L-1,1,maxn-1);
            update(R,1,maxn-1);
            K+=2;
        }
        fora2(i,1,N)
        {
            int tem=sum(i);
            if(i!=1)printf(" ");
            printf("%d",(tem%2)^a[i]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liyang__abc/article/details/81810331