luogu4883 mzf的考验
题目描述:
题解:
当然splay。
区间翻转是基本操作。
区间异或?按套路记录区间内每一位$1$的个数,异或的时候按位取反即可。
区间查询同理。
因为要按位维护,所以复杂度多了个log。
不开O2只有30,开O2能过。
代码:
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- const int N = 100050;
- template<typename T>
- inline void read(T&x)
- {
- T f = 1,c = 0;char ch=getchar();
- while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
- while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
- x = f*c;
- }
- int n,m,a[N];
- struct Splay
- {
- int fa[N],ch[N][2],v[N],siz[N],tag[N],mp[N][22],rt;
- bool res[N];
- inline void rever(int u){swap(ch[u][0],ch[u][1]);res[u]^=1;}
- inline void add(int u,int k)
- {
- if(!u)return ;
- tag[u]^=k;v[u]^=k;
- for(int i=0;i<20;i++)if(k&(1<<i))
- mp[u][i]=siz[u]-mp[u][i];
- }
- inline void update(int u)
- {
- siz[u] = siz[ch[u][0]]+siz[ch[u][1]]+1;
- for(int i=0;i<20;i++)
- mp[u][i]=mp[ch[u][0]][i]+mp[ch[u][1]][i]+((v[u]>>i)&1);
- }
- inline void pushdown(int u)
- {
- if(tag[u])
- {
- add(ch[u][0],tag[u]);
- add(ch[u][1],tag[u]);
- tag[u]=0;
- }
- if(res[u])
- {
- rever(ch[u][0]);
- rever(ch[u][1]);
- res[u]=0;
- }
- }
- void rotate(int x)
- {
- int y = fa[x],z = fa[y],k = (ch[y][1]==x);
- ch[z][ch[z][1]==y] = x,fa[x] = z;
- ch[y][k] = ch[x][!k],fa[ch[x][!k]] = y;
- ch[x][!k] = y,fa[y] = x;
- update(y),update(x);
- }
- void down(int x)
- {
- if(fa[x])down(fa[x]);
- pushdown(x);
- }
- void splay(int x,int goal)
- {
- down(x);
- while(fa[x]!=goal)
- {
- int y = fa[x],z = fa[y];
- if(z!=goal)
- (ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
- rotate(x);
- }
- if(!goal)rt = x;
- }
- int build(int l,int r,int f)
- {
- if(l>r)return 0;
- int mid = (l+r)>>1;
- ch[mid][0] = build(l,mid-1,mid);
- ch[mid][1] = build(mid+1,r,mid);
- fa[mid] = f,v[mid] = a[mid-1];
- update(mid);
- return mid;
- }
- int get_kth(int u,int k)
- {
- pushdown(u);
- int tmp = siz[ch[u][0]];
- if(k<=tmp)return get_kth(ch[u][0],k);
- else if(k==tmp+1)return u;
- else return get_kth(ch[u][1],k-1-tmp);
- }
- void rvs(int l,int r)
- {
- int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
- splay(lp,0),splay(rp,lp);
- rever(ch[rp][0]);
- }
- void ins(int l,int r,int d)
- {
- int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
- splay(lp,0),splay(rp,lp);
- add(ch[rp][0],d);
- }
- ll query(int l,int r)
- {
- int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
- splay(lp,0),splay(rp,lp);
- ll ret = 0;
- for(int i=0;i<20;i++)
- ret+=(1ll<<i)*mp[ch[rp][0]][i];
- return ret;
- }
- }tr;
- int main()
- {
- read(n),read(m);
- for(int i=1;i<=n;i++)read(a[i]);
- tr.rt=tr.build(1,n+2,0);
- for(int op,l,r,d,i=1;i<=m;i++)
- {
- read(op),read(l),read(r);
- if(op==1)tr.rvs(l,r);
- else if(op==2){read(d);tr.ins(l,r,d);}
- else printf("%lld\n",tr.query(l,r));
- }
- return 0;
- }
luogu4883 mzf的考验的更多相关文章
- 洛谷 P4883 mzf的考验 解题报告
P4883 mzf的考验 题目背景 \(mzf\)立志要成为一个豪杰,当然,他也是一个\(OIer\). 他希望自己除了会\(OI\)之外还会各种东西,比如心理学.吉他.把妹等等. 为了让自己有更大的 ...
- 【洛谷】P4883 mzf的考验
[洛谷]P4883 mzf的考验 最近忽然放弃治疗开始随机跳题了 感觉还行 就是必须吸氧感觉有点糟糕... 这题翻转和求和都是平衡树基本操作,那个异或可以通过维护树中\(2\)进制下第\(2^{i}\ ...
- P4883 mzf的考验[平衡树]
P4883 mzf的考验 维护一种数据结构 支持区间翻转 区间异或 区间求和- 显然 fhq treap 区间异或显然是拆位 ~~然后复杂度*20~~ 第一次先遍历一下整棵树 pushup 一下 就可 ...
- 洛谷【P4883】mzf的考验
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
- mzf的考验
题解: 比较水吧 显然是平衡树的操作 然后就是写写写 用对拍来查错相比之下直接样例查还是比较容易的 刚开始没有优化常数没开O2就变成暴力分了smg 开了O2就a了 代码: #include <b ...
- USB Type-C 应用面临安全性考验,USB-IF 将推动新认证机制
USB 应用已经达到空前盛况,横跨电脑.移动设备.周边设备.影音器材等范畴,是一个极为普遍常见的界面.进入 USB Type-C 世代由于一并推动 USB-PD,过去没有严格执行的认证要求,基于安全性 ...
- 如果不能显示真正的考验个别车型toast问题解决
当真正的考验个别车型toast不显示信息,找到两个解决方式.不知还有什么其他有效方法.期待大神们的分享!.! 1.手动方案:设置-->应用软件管理-->相应APP-->勾选显示通知框 ...
- BZOJ:4333: JSOI2012 智者的考验
4333: JSOI2012 智者的考验 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 68 Solved: 18[Submit][Status][ ...
- 每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感。出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往。
每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感.出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往.
随机推荐
- 聚类算法在 D2C 布局中的应用
1.摘要 聚类是统计数据分析的一门技术,在许多领域受到广泛的应用,包括机器学习.数据挖掘.图像分析等等.聚类就是把相似的对象分成不同的组别或者更多的子集,从而让每个子集的成员对象都有相似的一些属性. ...
- Azure AD(六)添加自定义域名
一,引言 每当我们在 Azure Portal 上创建新的租户时,都会在设置租户的 "初始域名" 后加上 ".onmicrosoft.com",默认情况下 &q ...
- JUC并发工具类之 CountDownLatch等待多线程完成
上篇JUC同步工具之Semaphore - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)示例中,资源释放一个线程就可以退出然后另一个线程可以使用了,那如果需要所有规定数量的资源同时释放了才 ...
- 日行一算(Table-文字输出)
题目 +---+---+---+ | | | | +---+---+---+ | | | | +---+---+---+ | | | | +---+---+---+ 题目描述 上图是一个Mysql查询 ...
- Spring Boot 学习-基础
一.Spring Boot 概述 SpringBoot 定义 Spring Boot 并不是用来替代 Spring 的新框架,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具 ...
- 如何在Excel里安装excel插件?
随着科技的发展,人们对数据分析的要求越来越多, Excel也存在一些问题,长期困扰一线业务用户:首先是性能问题.对于大数据量,Excel处理起来很慢.数据获取的过程麻烦,特别是周期性的数据获取,每次都 ...
- CSS/CSS3语法新特性笔记
CSS层叠样式表 三大特性 层叠性:相同的样式会覆盖 继承性:属性可向下继承 优先级:范围越小权重越高 选择器 基础选择器 标签选择器 1 body { 2 color:#fff; 3 } 类选择器 ...
- Python:取整函数、四舍五入
int(a) 绝对值向0方向取整,符号不变 math.ceil(a) 向正无穷取整 math.floor(a) 向负无穷取整 round(a,n=0) 四舍五入,第二个参数说明保留小数位数
- WPS:在Word中插入Visio绘制的流程图
在Word菜单栏 插入->对象 如果Visio绘图已经保存为了文件,可以选择由文件创建
- linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题
发现问题的原因: 安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5. ...