zoukankan      html  css  js  c++  java
  • [codevs] 1699 开关灯

    题目描述 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

    思路

    线段树;

    代码实现

     1 #include<cstdio>
     2 const int maxn=1e5+10;
     3 inline int min_(int x,int y){return x<y?x:y;}
     4 inline int max_(int x,int y){return x>y?x:y;}
     5 int n,m;
     6 int t[maxn<<2];
     7 bool f[maxn<<2];
     8 void down(int k,int l,int r){
     9     int mid=l+r>>1,ls=k<<1,rs=ls|1;
    10     t[ls]=mid-l+1-t[ls],f[ls]^=1;
    11     t[rs]=r-mid-t[rs],f[rs]^=1;
    12     f[k]^=1;
    13 }
    14 void change(int k,int l,int r,int al,int ar){
    15     if(l==al&&r==ar){
    16         t[k]=r-l+1-t[k];
    17         f[k]^=1;
    18         return;
    19     }
    20     if(f[k]) down(k,l,r);
    21     int mid=l+r>>1,ls=k<<1,rs=ls|1;
    22     if(al<=mid) change(ls,l,mid,al,min_(ar,mid));
    23     if(ar>mid) change(rs,mid+1,r,max_(al,mid+1),ar);
    24     t[k]=t[ls]+t[rs];
    25 }
    26 int search(int k,int l,int r,int al,int ar){
    27     if(l==al&&r==ar) return t[k];
    28     if(f[k]) down(k,l,r);
    29     int mid=l+r>>1,ls=k<<1,rs=ls|1,ret=0;
    30     if(al<=mid) ret+=search(ls,l,mid,al,min_(ar,mid));
    31     if(ar>mid) ret+=search(rs,mid+1,r,max_(al,mid+1),ar);
    32     return ret;
    33 }
    34 int main(){
    35     scanf("%d%d",&n,&m);
    36     int opt,l,r;
    37     while(m--){
    38         scanf("%d%d%d",&opt,&l,&r);
    39         if(opt==0) change(1,1,n,l,r);
    40         if(opt==1) printf("%d
    ",search(1,1,n,l,r));
    41     }
    42     return 0;
    43 }

  • 相关阅读:
    人生感悟:人与人之间的距离
    9月22日测试题目
    Java自学第五十二天
    Java自学第五十一天
    Java自学第五十天
    Java自学第四十九天
    Java自学第四十八天
    Java自学第四十七天
    Java自学第四十六天
    Java自学第四十五天
  • 原文地址:https://www.cnblogs.com/J-william/p/8067578.html
Copyright © 2011-2022 走看看