• 洛谷——P2846 [USACO08NOV]光开关Light Switching


    P2846 [USACO08NOV]光开关Light Switching

    题目大意:

    灯是由高科技——外星人鼠标操控的。你只要左击两个灯所连的鼠标,

    这两个灯,以及之间的灯都会由暗变亮,或由亮变暗。右击两个灯所连的鼠

    标,你就可以知道这两个灯,以及之间的灯有多少灯是亮的。起初所有灯都是暗的,你的任务是在LZ之前算出灯的亮灭。

    线段树的懒标记下传

    #include<bits/stdc++.h>
    #define N 1000005
    #define LL long long
    #define RE register
    #define IN inline
    
    using namespace std;
    
    IN void in(int &x){
        int flg=1;RE char ch=getchar();x=0;
        for(;ch>'9'||ch<'0';){if(ch=='-') flg=-1;ch=getchar();}
        for(;ch<='9'&&ch>='0';ch=getchar()) x=x*10+ch-'0';
        x*=flg;
    }
    
    struct node{
        int l,r,w,f;
    }tr[N];
    int n,m,ans,X,tot;
    int e[N];
    
    IN void build(int k,int l,int r){
        tr[k].l=l;tr[k].r=r;
        if(l==r){
            tr[k].w=e[l];
            return;
        }int mid=(l+r)/2;
        build(k*2,l,mid);build(k*2+1,mid+1,r);
        tr[k].w=tr[k*2].w+tr[k*2+1].w;
    }
    
    IN void down(int k){
        tr[k].f^=1;
        tr[k*2].w=(tr[k*2].r-tr[k*2].l+1)-tr[k*2].w;
        tr[k*2+1].w=(tr[k*2+1].r-tr[k*2+1].l+1)-tr[k*2+1].w;
        tr[k*2].f^=1;
        tr[k*2+1].f^=1;
    }
    
    IN void ask_interval(int k,int l,int r){
        int ll=tr[k].l,rr=tr[k].r,mid=(ll+rr)/2;
        if(ll>=l&&rr<=r){
            ans+=tr[k].w;
            return;
        }if(tr[k].f) down(k);
        if(l<=mid) ask_interval(k*2,l,r);
        if(r>mid) ask_interval(k*2+1,l,r);
        tr[k].w=tr[k*2].w+tr[k*2+1].w;
    }
    
    IN void change_interval(int k,int l,int r){
        int ll=tr[k].l,rr=tr[k].r,mid=(ll+rr)/2;
        if(ll>=l&&rr<=r){
            tr[k].w=(rr-ll+1)-tr[k].w;
            tr[k].f^=1;
            return;
        }if(tr[k].f) down(k);
        if(l<=mid) change_interval(k*2,l,r);
        if(r>mid) change_interval(k*2+1,l,r);
        tr[k].w=tr[k*2].w+tr[k*2+1].w;
    }
    
    int main()
    {
        in(n);in(m);
        build(1,1,n);
        while(m--){
            int p,l,r;
            in(p);in(l);in(r);
            if(p==0){
                change_interval(1,l,r);
            }else {
                ans=0,ask_interval(1,l,r);
                printf("%d
    ",ans);
            }
        }return 0;
    }
  • 相关阅读:
    牛人的博客,备忘
    dev gridlookupedit
    Oracle with as 用法
    动态加载DLL对接第三方接口
    Oracle执行计划不稳定
    JAVA Cannot find class [×××] for bean with name '××' defined in class path resource [×××] 问题解决方法
    JAVA B/S通过摄像头采集图片信息解决方案。
    使控件悬浮在页面上不随滚动条变化的JQUERY插件
    原生态水平和垂直拉伸的JQUERY插件
    javascript实现继承的类
  • 原文地址:https://www.cnblogs.com/song-/p/9676569.html
Copyright © 2020-2023  润新知