读书人

codeforces #149 div 二

发布时间: 2012-11-23 22:54:33 作者: rapoo

codeforces #149 div 2
A 题,巨水,题意读懂就能A。

105.

就是所有线段的总长度不超过10^5。

晕了,这就表示最多是100000个点,可以用BFS来做。。。

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 100000#define inf INT_MAX#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define FOR(i,s,t) for(int i=(s);i<=(t);++i)#define ll long longusing namespace std;struct Seg_Tree{    int l,r,flag;    ll len;    ll digt[22];}tree[Max*4];int a[Max];void PushUp(int u){    for(int i=0;i<22;i++)    tree[u].digt[i]=tree[LL(u)].digt[i]+tree[RR(u)].digt[i];}void build(int l,int r,int u){    tree[u].l=l;    tree[u].r=r;    tree[u].len=r-l+1;    tree[u].flag=0;    if(l==r)    {        for(int i=0;i<22;i++)        if(1&(a[l]>>i))        tree[u].digt[i]=1;        return ;    }    int mid=l+r>>1;    build(l,mid,LL(u));    build(mid+1,r,RR(u));    PushUp(u);}void PushDown(int u){    if(tree[u].flag)    {        tree[LL(u)].flag^=tree[u].flag;        tree[RR(u)].flag^=tree[u].flag;        for(int i=0;i<22;i++)        if(1&(tree[u].flag>>i))        {            tree[LL(u)].digt[i]=tree[LL(u)].len-tree[LL(u)].digt[i];            tree[RR(u)].digt[i]=tree[RR(u)].len-tree[RR(u)].digt[i];        }    }    tree[u].flag=0;}void update(int l,int r,int u,int x){    if(l==tree[u].l&&tree[u].r==r)    {        tree[u].flag^=x;        for(int i=0;i<22;i++)        if(1&(x>>i))        tree[u].digt[i]=tree[u].len-tree[u].digt[i];        return ;    }    PushDown(u);    int mid=tree[u].l+tree[u].r>>1;    if(l>mid)    update(l,r,RR(u),x);    else if(r<=mid)    update(l,r,LL(u),x);    else    {        update(l,mid,LL(u),x);        update(mid+1,r,RR(u),x);    }    PushUp(u);}ll ans;void query(int l,int r,int u){    if(l==tree[u].l&&r==tree[u].r)    {        for(int i=0;i<22;i++)        ans+=tree[u].digt[i]*(1ll<<i);        return ;    }    PushDown(u);    int mid=tree[u].l+tree[u].r>>1;    if(l>mid)    query(l,r,RR(u));    else if (r<=mid)    query(l,r,LL(u));    else    {        query(l,mid,LL(u));        query(mid+1,r,RR(u));    }   // PushUp(u);}int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);    int m;    cin>>m;    build(1,n,1);    while(m--)    {        int op;        scanf("%d",&op);        if(op==1)        {            int x,y;            scanf("%d%d",&x,&y);            ans=0;            query(x,y,1);            cout<<ans<<endl;        }        else        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            update(x,y,1,z);        }    }    return 0;}


读书人网 >编程

热点推荐