zoukankan      html  css  js  c++  java
  • 【codevs1690】开关灯 (线段树 区间修改+区间求和 (标记))

    【codevs1690】开关灯

    题目描述 Description

        YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人陆续按下开关,这些开关可以改变从第i盏灯到第j盏灯的状态,现在YYX想知道,从第x盏灯到第y盏灯中有多少是亮着的(1<=i,j,x,y<=N)

    输入描述 Input Description

    第 1 行: 用空格隔开的两个整数N和M
    第 2..M+1 行: 每行表示一个操作, 有三个用空格分开的整数: 指令号(0代表按下开关,1代表询问状态), x 和 y 

    输出描述 Output Description

    第 1..询问总次数 行:对于每一次询问,输出询问的结果

    样例输入 Sample Input

    4 5
    0 1 2
    0 2 4
    1 2 3
    0 2 4
    1 1 4

    样例输出 Sample Output

    1
    2
     

    数据范围及提示 Data Size & Hint

    一共4盏灯,5个操作,下面是每次操作的状态(X代表关上的,O代表开着的):

    XXXX -> OOXX -> OXOO -> 询问1~3 -> OOXX -> 询问1~4

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    const int M = 2e5+10;
    int lazy[M<<2],sum[M<<2];
    void pushup(int rt){
        sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    }
    
    void pushdown(int rt,int m){
        if(lazy[rt]){
            lazy[rt<<1] += lazy[rt];
            lazy[rt<<1]%=2;
            lazy[rt<<1|1] += lazy[rt];
            lazy[rt<<1|1]%=2;
            sum[rt<<1] = (m-(m>>1))-sum[rt<<1];
            sum[rt<<1|1] = (m>>1)-sum[rt<<1|1];
            lazy[rt] = 0;
        }
    }
    
    void build(int l,int r,int rt){
        lazy[rt] = 0;
        if(l == r){
            sum[rt] = 0;
            return ;
        }
        int m = (l + r) >> 1;
        build(lson);
        build(rson);
        pushup(rt);
    }
    
    void update(int L,int R,int l,int r,int rt){
        if(L <= l&&R >= r){
            lazy[rt]++;
            lazy[rt]%=2;
            sum[rt] = (r-l+1)-sum[rt];
            return;
        }
        pushdown(rt,r-l+1);
        int m = (l + r)>>1;
        if(L <= m) update(L,R,lson);
        if(R > m) update(L,R,rson);
        pushup(rt);
    }
    
    int query(int L,int R,int l,int r,int rt){
        if(L <= l&&R >= r){
            return sum[rt];
        }
        pushdown(rt,r-l+1);
        int m = (l + r) >> 1;
        int ret = 0;
        if(L <= m) ret+=query(L,R,lson);
        if(R > m) ret += query(L,R,rson);
        return ret;
    }
    
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int n,m,x,y,f;
        cin>>n>>m;
        build(1,n,1);
        while(m--){
            cin>>f>>x>>y;
            if(f==0) update(x,y,1,n,1);
            else cout<<query(x,y,1,n,1)<<endl;
        }
    }
  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/kls123/p/8570434.html
Copyright © 2011-2022 走看看