博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2574 XOR的艺术
阅读量:4708 次
发布时间:2019-06-10

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

其实跟线段树1,2差不多,唯一需要区别的就是lazy数组及标记下传时候的操作了。

线段树左儿子的个数应该是比右儿子的个数大的。所以我们需要再将区间异或时,一定要搞清楚每个区间的元素有多少个,然后再将该区间元素的0,1个数颠倒一下就好了

#include 
#define ll long long #define ls l, mid, root << 1 #define rs mid + 1, r, root << 1 | 1using namespace std; int n, m, ans[800100], a[800100], lazy[800100];//ans表示一个根节点下1的个数 inline void pushup(int root){ ans[root] = ans[root << 1] + ans[root << 1 | 1];}inline void build(int l, int r, int root){ if (l == r) { ans[root] = a[l]; return; } int mid = (l + r) >> 1; build(ls), build(rs); pushup(root);}inline void pushdown(int l, int r, int root){ int mid = (l + r) >> 1; int len = r - l + 1; if (lazy[root]) //如果该节点还没有异或1,那就异或 { lazy[root << 1] ^= 1; lazy[root << 1 | 1] ^= 1; ans[root << 1] = len - (len >> 1) - ans[root << 1];//当然还需要更新,原root<<1里有len-len>>1个数。 ans[root << 1 | 1] = (len >> 1) - ans[root << 1 | 1]; lazy[root] = 0; }}void update(int l, int r, int root, int ql, int qr){ int len = r - l + 1; if (ql <= l && r <= qr) { lazy[root] ^= 1; ans[root] = len - ans[root]; return; } int mid = (l + r) >> 1; pushdown(l, r, root); if (ql <= mid) update(ls, ql, qr); if (qr >= mid + 1) update(rs, ql, qr); pushup(root);}int query(int l, int r, int root, int ql, int qr){ int res = 0; if (ql <= l && r <= qr) return ans[root]; int mid = (l + r) >> 1; pushdown(l, r, root); if (ql <= mid) res += query(ls, ql, qr); if (qr >= mid + 1) res += query(rs, ql, qr); return res;}int main(){ cout << (5 >> 1); return 0; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { char c; cin >> c; a[i] = c - '0'; } build(1, n, 1); while (m--) { int p, l, r; cin >> p >> l >> r; if (p) printf("%d\n", query(1, n, 1, l, r)); else update(1, n, 1, l, r); } return 0;}

转载于:https://www.cnblogs.com/liuwenyao/p/11348451.html

你可能感兴趣的文章
arguments.callee的作用及替换方案
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
zTree async 动态参数处理
查看>>
Oracle学习之常见错误整理
查看>>
数据库插入数据乱码问题
查看>>
【转】IT名企面试:微软笔试题(1)
查看>>
IO流入门-第十章-DataInputStream_DataOutputStream
查看>>
DRF的分页
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>