• spoj IITWPC4F


    IITWPC4F - Gopu and the Grid Problem

    no tags 

    Gopu is interested in the integer co-ordinates of the X-Y plane (0<=x,y<=100000). Each integer coordinate contain a lamp, initially all the lamps are in off mode. Flipping a lamp means switching it on if it is in off mode and vice versa. Maggu will ask gopu 3 type of queries.

     

     

    Type 1:  x l r,  meaning: flip all the lamps whose x-coordinate are between l and r (both inclusive) irrespective of the y coordinate.

     

     

    Type 2:  y l r, meaning: flip all the lamps whose y-coordinate are between l and r (both inclusive) irrespective of the x coordinate.

     

     

    Type 3: q x y X Y, meaning: count the number of lamps which are in ‘on mode’(say this number be A) and ‘off mode’ (say this number  be B) in the region where x-coordinate is between x and X(both inclusive) and y-coordinate is between y and Y(both inclusive).

    Input

    First line contains Q-number of queries that maggu will ask to gopu. (Q <= 10^5)

     

    Then there will be Q lines each containing a query of one of the three type described above.

    Output

    For each query of 3rd type you need to output a line containing one integer A.

    Example

    Input:

    3

    x 0 1

    y 1 2

    q 0 0 2 2

    Output: 
     4

    线段树

    题目链接:http://www.spoj.com/problems/IITWPC4F/en/

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<set>
    #include<map>
    using namespace std;
    #define ll long long
    #define pi (4*atan(1.0))
    #define mk make_pair
    #define eps 1e-7
    #define bug(x)  cout<<"bug"<<x<<endl;
    const int N=5e5+10,M=1e6+10,inf=2147483647;
    const ll INF=1e18+10,mod=1000000007;
    
    ///   数组大小
    struct SGT
    {
        int tree[N],lazy[N];
        void pushup(int pos)
        {
            tree[pos]=tree[pos<<1|1]+tree[pos<<1];
        }
        void pushdown(int pos,int l,int r)
        {
            if(lazy[pos])
            {
                lazy[pos<<1]^=1;
                lazy[pos<<1|1]^=1;
                int mid=(l+r)>>1;
                tree[pos<<1]=(mid-l+1)-tree[pos<<1];
                tree[pos<<1|1]=(r-mid)-tree[pos<<1|1];
                lazy[pos]=0;
            }
        }
        void build(int l,int r,int pos)
        {
            tree[pos]=lazy[pos]=0;
            if(l==r)return;
            int mid=(l+r)>>1;
            build(l,mid,pos<<1);
            build(mid+1,r,pos<<1|1);
        }
        void update(int L,int R,int l,int r,int pos)
        {
            if(L<=l&&r<=R)
            {
                lazy[pos]^=1;
                tree[pos]=(r-l+1)-tree[pos];
                return;
            }
            pushdown(pos,l,r);
            int mid=(l+r)>>1;
            if(L<=mid)
                update(L,R,l,mid,pos<<1);
            if(R>mid)
                update(L,R,mid+1,r,pos<<1|1);
            pushup(pos);
        }
        int query(int L,int R,int l,int r,int pos)
        {
            if(L<=l&&r<=R)
                return tree[pos];
            pushdown(pos,l,r);
            int mid=(l+r)>>1;
            int ans=0;
            if(L<=mid)
                ans+=query(L,R,l,mid,pos<<1);
            if(R>mid)
                ans+=query(L,R,mid+1,r,pos<<1|1);
            return ans;
        }
    };
    SGT x,y;
    char ch[10];
    int main()
    {
        int q;
        int n=100010;
        while(~scanf("%d",&q))
        {
            x.build(1,n,1);
            y.build(1,n,1);
            while(q--)
            {
                int l,r;
                scanf("%s%d%d",ch,&l,&r);
                //if(l<r)swap(l,r);
                if(ch[0]=='x')
                    x.update(l+1,r+1,1,n,1);
                else if(ch[0]=='y')
                    y.update(l+1,r+1,1,n,1);
                else
                {
                    int L,R;
                    scanf("%d%d",&L,&R);
                    //if(L<R)swap(L,R);
                    int xx=x.query(l+1,L+1,1,n,1);
                    int yy=y.query(r+1,R+1,1,n,1);
                    ll ans=0;
                    ans+=1LL*xx*(R-r+1);
                    ans+=1LL*yy*(L-l+1);
                    ans-=2LL*xx*yy;
                    printf("%lld
    ",ans);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    如何使用数据卷在宿主机和docker容器之间共享文件
    Debian 7 安装 Docker
    ajax简单封装
    GridView列的排序功能
    SqlHelper帮助类
    模板引擎小例子
    WCF练习小程序总结
    热线接口开发调试工作记录
    在Oracle中使用rank()over()排名的问题
    项目实施中出现的问题点汇总
  • 原文地址:https://www.cnblogs.com/jhz033/p/6728869.html
Copyright © 2020-2023  润新知