题目描述:

luogu

题解:

当然splay。

区间翻转是基本操作。

区间异或?按套路记录区间内每一位$1$的个数,异或的时候按位取反即可。

区间查询同理。

因为要按位维护,所以复杂度多了个log。

不开O2只有30,开O2能过。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = 100050;
  7. template<typename T>
  8. inline void read(T&x)
  9. {
  10. T f = 1,c = 0;char ch=getchar();
  11. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
  13. x = f*c;
  14. }
  15. int n,m,a[N];
  16. struct Splay
  17. {
  18. int fa[N],ch[N][2],v[N],siz[N],tag[N],mp[N][22],rt;
  19. bool res[N];
  20. inline void rever(int u){swap(ch[u][0],ch[u][1]);res[u]^=1;}
  21. inline void add(int u,int k)
  22. {
  23. if(!u)return ;
  24. tag[u]^=k;v[u]^=k;
  25. for(int i=0;i<20;i++)if(k&(1<<i))
  26. mp[u][i]=siz[u]-mp[u][i];
  27. }
  28. inline void update(int u)
  29. {
  30. siz[u] = siz[ch[u][0]]+siz[ch[u][1]]+1;
  31. for(int i=0;i<20;i++)
  32. mp[u][i]=mp[ch[u][0]][i]+mp[ch[u][1]][i]+((v[u]>>i)&1);
  33. }
  34. inline void pushdown(int u)
  35. {
  36. if(tag[u])
  37. {
  38. add(ch[u][0],tag[u]);
  39. add(ch[u][1],tag[u]);
  40. tag[u]=0;
  41. }
  42. if(res[u])
  43. {
  44. rever(ch[u][0]);
  45. rever(ch[u][1]);
  46. res[u]=0;
  47. }
  48. }
  49. void rotate(int x)
  50. {
  51. int y = fa[x],z = fa[y],k = (ch[y][1]==x);
  52. ch[z][ch[z][1]==y] = x,fa[x] = z;
  53. ch[y][k] = ch[x][!k],fa[ch[x][!k]] = y;
  54. ch[x][!k] = y,fa[y] = x;
  55. update(y),update(x);
  56. }
  57. void down(int x)
  58. {
  59. if(fa[x])down(fa[x]);
  60. pushdown(x);
  61. }
  62. void splay(int x,int goal)
  63. {
  64. down(x);
  65. while(fa[x]!=goal)
  66. {
  67. int y = fa[x],z = fa[y];
  68. if(z!=goal)
  69. (ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
  70. rotate(x);
  71. }
  72. if(!goal)rt = x;
  73. }
  74. int build(int l,int r,int f)
  75. {
  76. if(l>r)return 0;
  77. int mid = (l+r)>>1;
  78. ch[mid][0] = build(l,mid-1,mid);
  79. ch[mid][1] = build(mid+1,r,mid);
  80. fa[mid] = f,v[mid] = a[mid-1];
  81. update(mid);
  82. return mid;
  83. }
  84. int get_kth(int u,int k)
  85. {
  86. pushdown(u);
  87. int tmp = siz[ch[u][0]];
  88. if(k<=tmp)return get_kth(ch[u][0],k);
  89. else if(k==tmp+1)return u;
  90. else return get_kth(ch[u][1],k-1-tmp);
  91. }
  92. void rvs(int l,int r)
  93. {
  94. int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
  95. splay(lp,0),splay(rp,lp);
  96. rever(ch[rp][0]);
  97. }
  98. void ins(int l,int r,int d)
  99. {
  100. int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
  101. splay(lp,0),splay(rp,lp);
  102. add(ch[rp][0],d);
  103. }
  104. ll query(int l,int r)
  105. {
  106. int lp = get_kth(rt,l),rp = get_kth(rt,r+2);
  107. splay(lp,0),splay(rp,lp);
  108. ll ret = 0;
  109. for(int i=0;i<20;i++)
  110. ret+=(1ll<<i)*mp[ch[rp][0]][i];
  111. return ret;
  112. }
  113. }tr;
  114. int main()
  115. {
  116. read(n),read(m);
  117. for(int i=1;i<=n;i++)read(a[i]);
  118. tr.rt=tr.build(1,n+2,0);
  119. for(int op,l,r,d,i=1;i<=m;i++)
  120. {
  121. read(op),read(l),read(r);
  122. if(op==1)tr.rvs(l,r);
  123. else if(op==2){read(d);tr.ins(l,r,d);}
  124. else printf("%lld\n",tr.query(l,r));
  125. }
  126. return 0;
  127. }

luogu4883 mzf的考验的更多相关文章

  1. 洛谷 P4883 mzf的考验 解题报告

    P4883 mzf的考验 题目背景 \(mzf\)立志要成为一个豪杰,当然,他也是一个\(OIer\). 他希望自己除了会\(OI\)之外还会各种东西,比如心理学.吉他.把妹等等. 为了让自己有更大的 ...

  2. 【洛谷】P4883 mzf的考验

    [洛谷]P4883 mzf的考验 最近忽然放弃治疗开始随机跳题了 感觉还行 就是必须吸氧感觉有点糟糕... 这题翻转和求和都是平衡树基本操作,那个异或可以通过维护树中\(2\)进制下第\(2^{i}\ ...

  3. P4883 mzf的考验[平衡树]

    P4883 mzf的考验 维护一种数据结构 支持区间翻转 区间异或 区间求和- 显然 fhq treap 区间异或显然是拆位 ~~然后复杂度*20~~ 第一次先遍历一下整棵树 pushup 一下 就可 ...

  4. 洛谷【P4883】mzf的考验

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  5. mzf的考验

    题解: 比较水吧 显然是平衡树的操作 然后就是写写写 用对拍来查错相比之下直接样例查还是比较容易的 刚开始没有优化常数没开O2就变成暴力分了smg 开了O2就a了 代码: #include <b ...

  6. USB Type-C 应用面临安全性考验,USB-IF 将推动新认证机制

    USB 应用已经达到空前盛况,横跨电脑.移动设备.周边设备.影音器材等范畴,是一个极为普遍常见的界面.进入 USB Type-C 世代由于一并推动 USB-PD,过去没有严格执行的认证要求,基于安全性 ...

  7. 如果不能显示真正的考验个别车型toast问题解决

    当真正的考验个别车型toast不显示信息,找到两个解决方式.不知还有什么其他有效方法.期待大神们的分享!.! 1.手动方案:设置-->应用软件管理-->相应APP-->勾选显示通知框 ...

  8. BZOJ:4333: JSOI2012 智者的考验

    4333: JSOI2012 智者的考验 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 68  Solved: 18[Submit][Status][ ...

  9. 每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感。出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往。

    每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感.出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往.

随机推荐

  1. 聚类算法在 D2C 布局中的应用

    1.摘要 聚类是统计数据分析的一门技术,在许多领域受到广泛的应用,包括机器学习.数据挖掘.图像分析等等.聚类就是把相似的对象分成不同的组别或者更多的子集,从而让每个子集的成员对象都有相似的一些属性. ...

  2. Azure AD(六)添加自定义域名

    一,引言 每当我们在 Azure Portal 上创建新的租户时,都会在设置租户的 "初始域名" 后加上 ".onmicrosoft.com",默认情况下 &q ...

  3. JUC并发工具类之 CountDownLatch等待多线程完成

    上篇JUC同步工具之Semaphore - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)示例中,资源释放一个线程就可以退出然后另一个线程可以使用了,那如果需要所有规定数量的资源同时释放了才 ...

  4. 日行一算(Table-文字输出)

    题目 +---+---+---+ | | | | +---+---+---+ | | | | +---+---+---+ | | | | +---+---+---+ 题目描述 上图是一个Mysql查询 ...

  5. Spring Boot 学习-基础

    一.Spring Boot 概述 SpringBoot 定义 Spring Boot 并不是用来替代 Spring 的新框架,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具 ...

  6. 如何在Excel里安装excel插件?

    随着科技的发展,人们对数据分析的要求越来越多, Excel也存在一些问题,长期困扰一线业务用户:首先是性能问题.对于大数据量,Excel处理起来很慢.数据获取的过程麻烦,特别是周期性的数据获取,每次都 ...

  7. CSS/CSS3语法新特性笔记

    CSS层叠样式表 三大特性 层叠性:相同的样式会覆盖 继承性:属性可向下继承 优先级:范围越小权重越高 选择器 基础选择器 标签选择器 1 body { 2 color:#fff; 3 } 类选择器 ...

  8. Python:取整函数、四舍五入

    int(a) 绝对值向0方向取整,符号不变 math.ceil(a) 向正无穷取整 math.floor(a) 向负无穷取整 round(a,n=0) 四舍五入,第二个参数说明保留小数位数

  9. WPS:在Word中插入Visio绘制的流程图

    在Word菜单栏 插入->对象 如果Visio绘图已经保存为了文件,可以选择由文件创建

  10. linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题

    发现问题的原因: 安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5. ...