好久没写线段树了。。被一道线段树裸题卡了一个上午

对区间进行异或,查询的时候直接用区间长度减去原有是数量就是改变完的数量

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
struct tree{
int l,r,sum;
}t[maxn*];
int n,m,ans;
int lazy[maxn*],a[maxn];
void add(int x,int l,int r){
lazy[x]^=;
t[x].sum=(r-l+)-t[x].sum;
}
void build(int x,int l,int r){
t[x].l=l;
t[x].r=r;
if(l==r){
return;
}
int mid=(l+r)>>;
build(x*,l,mid);
build(x*+,mid+,r);
}
void push(int x){
if(lazy[x]){
int mid=(t[x].l+t[x].r)>>;
add(x*,t[x].l,mid);add(x*+,mid+,t[x].r);
lazy[x]=;
}
}
int query(int x,int l,int r){
if(l<=t[x].l&&r>=t[x].r){
return t[x].sum;
}
if(l>t[x].r||r<t[x].l)
return ;
push(x);
return query(x*,l,r)+query(x*+,l,r);
}
void change(int x,int l,int r){
if(l<=t[x].l&&r>=t[x].r){
add(x,t[x].l,t[x].r);
return ;
}
if(l>t[x].r||r<t[x].l) return ;
push(x);
int mid=(t[x].l+t[x].r)>>;
change(x*,l,r);
change(x*+,l,r);
t[x].sum=t[x*].sum+t[x*+].sum;
}
int main(){
scanf("%d%d",&n,&m);
int x,y,z;
build(,,n);
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
if(x==){
ans=query(,y,z);
printf("%d\n",ans);
}
else {
change(,y,z);
/*printf("\n{");
for(int i=1;i<=7;i++){
cout<<t[i].sum<<" ";
}
printf("}\n");*/
}
} return ;
}

bzoj1230 开关灯 线段树的更多相关文章

  1. BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )

    线段树.. --------------------------------------------------------------------------------- #include< ...

  2. codevs 1690 开关灯 线段树+延迟标记

    1690 开关灯  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...

  3. codevs 1690 开关灯 线段树区间更新 区间查询Lazy

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  4. B1230 [Usaco2008 Nov]lites 开关灯 线段树

    就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...

  5. BZOJ 1230 Usaco2008 Nov 开关灯 线段树

    思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...

  6. 【codevs1690】开关灯 线段树

    这道题需要支持区间修改和区间询问,因此采用线段树加以维护. 由于求的是开着的灯的数目,因此维护sum:区间[ l , r ]中开着的灯的数目. tag取做0/1,表示区间是否反转,在进行标记下传时,如 ...

  7. 【codevs1690】开关灯 线段树 区间修改+区间求和(标记)

    [codevs1690]开关灯 2014年2月15日4930 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的 ...

  8. codevs1690 开关灯(线段树)

    1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description YYX家门前的街上有N(2< ...

  9. codevs 1690 开关灯 线段树水题

    没什么好说的,标记put表示开关是否开着. #include<cstdio> #include<cstring> #include<algorithm> using ...

随机推荐

  1. 解码URLDecode和编码URLEnCode

    在前台往后台传递参数的时候,在前台进行编码,在后台接收参数的时候,用Decode进行解码: 如果url中包含特殊字符如:&.html标签 <tr><td>等导致url无 ...

  2. php 生成 guid

    function guid( $opt = true ){ // Set to true/false as your default way to do this. if( function_exis ...

  3. Linux部署之批量自动安装系统之Kickstart篇

    1.         安装   2.         在桌面环境下啊配置   3.         Kickstart之基本配置   4.         Kickstart之安装方法   5.    ...

  4. sql中对日期的筛选

    #几个小时内的数据 DATE_SUB(NOW(), INTERVAL 5 HOUR) #今天 select * from 表名 where to_days(时间字段名) = to_days(now() ...

  5. LA3231 Fair Share 二分_网络流

    Code: #include<cstdio> #include<vector> #include<queue> #include<cstring> #i ...

  6. div隐藏但是依然占位置

    <!doctype html> <html> <head> <meta charset="utf-8"> <script ty ...

  7. 微软的鼠标 Microsoft mouse

    微软是做软件出身的厂商, 所以微软开发的软件质量毋庸置疑,Windows操作系统还有诸如Office的办公软件拥有庞大的用户群. 微软家的Visual Studio也被号称宇宙最强IDE,我个人也每天 ...

  8. HDU-2204- Eddy’s爱好 (容斥原理)

    题意 给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1 (1<=n<=1^18) 题解 (一开始^以为是异或懵逼了好久....) 额,显然1这个数比较讨厌 ...

  9. Ubuntu 如何进入系统文件/etc/profile修改内容

    转载:https://blog.csdn.net/cfq1491/article/details/81088117 /etc/profile 默认权限为 -rw-r--r-- 即只有root用户可以修 ...

  10. 【图灵杯 J】简单的变位词

    Description 变位词是指改变某个词的字母顺序后构成的新词.蔡老板最近沉迷研究变位词并给你扔了一道题: 给你一些单词,让你把里面的变位词分组找出来.互为变位词的归为一组,最后输出含有变位词最多 ...