poj 2777

来源:互联网 发布:sem和seo区别aso 编辑:程序博客网 时间:2024/05/22 06:04

线段树  + 位运算 位运算是很吊的存在。。

#include <cstdio>#include <cstring>#include <iostream>#include <stack>#include <queue>#include <vector>#include <map>#include <cmath>#include <set>#include <algorithm>using namespace std;typedef long long LL;typedef __int64 ll;#define Lson l,m,rt<<1#define Rson m+1,r,rt<<1|1#define Ls rt<<1#define Rs rt<<1|1int const MAXN = 100010;struct Tree{    int lazy,c;}tree[MAXN<<2];char s[3];inline void Swap(int &a,int &b){    int c = a;    a = b;    b = c;}inline void Push_Down(int rt){    if(tree[rt].lazy){        tree[Ls].lazy = tree[Rs].lazy = tree[rt].lazy;        tree[Ls].c = tree[rt].c;        tree[Rs].c = tree[rt].c;        tree[rt].lazy = 0;    }}inline void Push_Up(int rt){    tree[rt].c = tree[Ls].c | tree[Rs].c;}void Build(int l,int r,int rt){    tree[rt].c = 1;    tree[rt].lazy = 0;    if(l == r) return ;    int m =(l + r)>>1;    Build(Lson);    Build(Rson);}void Update(int l,int r,int rt,int L,int R,int c){    if(L <= l && r <= R){        tree[rt].c = 1<<(c - 1);        tree[rt].lazy = 1;        return ;    }    Push_Down(rt);    int m = (l + r)>>1;    if(L <= m) Update(Lson,L,R,c);    if(R > m) Update(Rson,L,R,c);    Push_Up(rt);}void   Query(int l,int r,int rt,int L,int R,int &c){    if(L <= l && r <= R){        c |= tree[rt].c;        return ;    }    Push_Down(rt);    int m = (l + r)>>1;    if(L <= m) Query(Lson,L,R,c);    if(R > m) Query(Rson,L,R,c);    Push_Up(rt);}int main(){    int l,t,o;    while(~scanf("%d%d%d",&l,&t,&o)){        Build(1,l,1);        for(int i = 0;i < o;i++){            scanf("%s",s);            int a = 0,b = 0,c = 0,sum = 0;            if(s[0] == 'C'){                int a,b,c;                scanf("%d%d%d",&a,&b,&c);                if(a > b) Swap(a,b);                Update(1,l,1,a,b,c);            }            else{                scanf("%d%d",&a,&b);                if(a > b) Swap(a,b);                Query(1,l,1,a,b,c);               //printf("%d\n",c);                for(int i = 0;i < t;i++){                    if(c & (1<<i)) sum++;                }                printf("%d\n",sum);            }        }    }    return 0;}


0 0
原创粉丝点击