• codevs 1690 开关灯 线段树水题


    没什么好说的,标记put表示开关是否开着。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=100003;
    int sum[N<<2];
    bool put[N<<2];
    void pushdown(int l,int r,int rt)
    {
        if (put[rt])
        {
            put[rt]=0;
            put[rt<<1]=!put[rt<<1];
            put[rt<<1|1]=!put[rt<<1|1];
            int mid=(l+r)>>1;
            sum[rt<<1]=mid-l+1-sum[rt<<1];
            sum[rt<<1|1]=r-mid-sum[rt<<1|1];
        }
    }
    void add(int L,int R,int l,int r,int rt)
    {
        if (L<=l&&r<=R)
        {
            sum[rt]=r-l+1-sum[rt];
            put[rt]=!put[rt];
            return;
        }
        int mid=(l+r)>>1;
        pushdown(l,r,rt);
        if (L<=mid) add(L,R,l,mid,rt<<1);
        if (R>mid) add(L,R,mid+1,r,rt<<1|1);
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    int quest(int L,int R,int l,int r,int rt)
    {
        if (L<=l&&r<=R)
         return sum[rt];
        int mid=(l+r)>>1,ans=0;
        pushdown(l,r,rt);
        if (L<=mid) ans+=quest(L,R,l,mid,rt<<1);
        if (R>mid) ans+=quest(L,R,mid+1,r,rt<<1|1);
        return ans;
    }
    int main()
    {
        int i,n,m,x,y,z;
        scanf("%d %d
    ",&n,&m);
        memset(sum,0,sizeof(sum));
        memset(put,0,sizeof(put));
        for (i=1;i<=m;++i)
        {
            scanf("%d %d %d
    ",&x,&y,&z);
            if (x==0) add(y,z,1,n,1);
            else printf("%d
    ",quest(y,z,1,n,1));
        }
        return 0;
    }

    这样就可以了。

  • 相关阅读:
    JavaScript 常见面试题
    textarea 元素的 placeholder 属性不显示
    CSS 画一个八卦
    CSS 画一个心
    JS判断客户端是否是iOS或者Android端
    前端面试题(一)
    选中文字改变默认颜色
    红包雨的实现
    template 的使用
    函数和入参
  • 原文地址:https://www.cnblogs.com/abclzr/p/5137352.html
Copyright © 2020-2023  润新知