luogu P2574 XOR的艺术 (线段树)

算是比较简单的线段树.

当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\(1\)的个数.

#include <iostream>
#include <cstdio>
#define lson now << 1
#define rson now << 1 | 1
const int maxN = 2e5 + 7; struct Node {
int l,r,Xor,sum;
}tree[maxN << 2]; void updata(int now) {
tree[now].sum = tree[lson].sum + tree[rson].sum;
return;
} void build(int l,int r,int now) {
tree[now].l = l;tree[now].r = r;
if(l == r) {
int a;
scanf("%1d",&a);
tree[now].sum = a ? 1 : 0;
return;
}
int mid = (l + r) >> 1;
build(l,mid,lson);
build(mid + 1,r,rson);
updata(now);
return;
} void work(int now) {
tree[now].sum = tree[now].r - tree[now].l + 1 - tree[now].sum;
tree[now].Xor ^= 1;
return;
} void pushdown(int now) {
if(!tree[now].Xor) return;
work(lson);
work(rson);
tree[now].Xor = 0;
return;
} void modify(int l,int r,int now) {
if(tree[now].l >= l && tree[now].r <= r) {
work(now);
return;
}
int mid = (tree[now].l + tree[now].r) >> 1;
pushdown(now);
if(mid >= l) modify(l,r,lson);
if(mid < r) modify(l,r,rson);
updata(now);
return;
} int query(int l,int r,int now) {
if(tree[now].l >= l && tree[now].r <= r)
return tree[now].sum;
int mid = (tree[now].l + tree[now].r) >> 1,sum = 0;
pushdown(now);
if(mid >= l) sum += query(l,r,lson);
if(mid < r) sum += query(l,r,rson);
return sum;
} int main() {
int n,m;
scanf("%d%d",&n,&m);
build(1,n,1);
int type,l,r;
while(m --) {
scanf("%d%d%d",&type,&l,&r);
if(type) printf("%d\n", query(l,r,1));
else modify(l,r,1);
}
return 0;
}

最新文章

  1. [3D数学基础:图形与游戏开发]专栏前言
  2. sstream
  3. iis7 运行 php5.5 的方法
  4. iOS解析JSON字符串报错Error Domain=NSCocoaErrorDomain Code=3840 &quot;Invalid escape sequence around character 586.&quot;
  5. GTD时间管理(3)---时间特区图
  6. bzoj题解汇总(1032~1051)
  7. 【转】[NOIP2003普及组]麦森数
  8. Php 的替代语法
  9. Android新浪微博客户端(四)——添加多个账户及认证
  10. Javascript quiz
  11. 一句话解释JVM中空间分配担保的问题
  12. 转delphi中nil的用法
  13. Android可以换行的布局
  14. Powerdesigner逆向工程64位Oracle数据库
  15. Spring Boot - 基础 POM 文件
  16. HNOI2019 JOJO
  17. 20135337——linux第四次实践:字符集总结与分析
  18. 向安装包中添加设备 UDID. 蒲公英内测
  19. MVC HTML页面使用
  20. Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)

热门文章

  1. (十一)SpringBoot导出excel文件
  2. jvm 调优(转)
  3. Java 执行linux命令(转)
  4. servlet小型应用服务器搭建通过tomcat发布web项目
  5. mongodb-Configuration
  6. Zynq7000开发系列-7(在Zybo上运行Linaro桌面系统)
  7. 模拟ssh、黏包、hashlib模块(MD5)
  8. python学习之串口编程
  9. I/O————字符流和流的关闭
  10. Dll加载总是出问题,显示无法加载