博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1230 开关灯 线段树
阅读量:5054 次
发布时间:2019-06-12

本文共 1349 字,大约阅读时间需要 4 分钟。

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

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

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

 

转载于:https://www.cnblogs.com/Elfish/p/7630927.html

你可能感兴趣的文章
http://lorempixel.com/ 可以快速产生假图
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
文件操作
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
graphite custom functions
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
oracle连接的三个配置文件(转)
查看>>
Centos下源码安装git
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
二叉树的遍历问题总结
查看>>
聊天室(C++客户端+Pyhton服务器)_1.框架搭设
查看>>
pytho logging
查看>>
Python内置函数(29)——help
查看>>
对Feature的操作插入添加删除
查看>>
phpcms 添加自定义表单 留言
查看>>
oracle导出/导入 expdp/impdp
查看>>
JAVA 技术类分享(二)
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
数据结构之查找算法总结笔记
查看>>