zoukankan      html  css  js  c++  java
  • 洛谷——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;
    }
  • 相关阅读:
    IDE警告信息不应该被忽略
    C#委托使用:多播 ,向委托注册多个方法
    C# random生成随机数全部一样
    使用dynamic动态设置属性值与反射设置属性值性能对比
    git基本使用
    sql server多数据库查询 远程数据库查询
    C# mvc统一通道使用过滤器
    拼凑json的实例
    java常考小程序
    几个触发器的实例
  • 原文地址:https://www.cnblogs.com/song-/p/9676569.html
Copyright © 2011-2022 走看看