题目分析:

对于一个$add$操作,它的特点是与树状数组的查询相同,会给$1$到它自己产生影响,而$query$操作则会途径所有包含它的树状数组点。现在$add$操作具有前向性(不会影响之后的点)。所以实际上这是求后缀和。

现在我们知道,对于$query(l,r)$,它等于${Xor}_{i=l-1}^{r-1}A[i]$。与原答案异或,得到$A[l-1] \oplus A[r]$,若它为$1$则假,否则为真。所以我们把它看作平面上的点,对于一个$add(l,r)$操作,会对右端点在其中的产生$\frac{1}{r-l+1}$的改变影响,对两端都在其中的产生$\frac{2}{r-l+1}$的改变影响,对左端点在其中的产生$\frac{1}{r-l+1}$的改变影响。标记合并不难。然后标记永久化一下就行了。

对于$l=1$的单独处理。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = ;
  5.  
  6. const int mod = ;
  7.  
  8. int n,m,num=,xL,xR,yL,yR,ans;
  9. struct qy{
  10. int cas,l,r;
  11. }Q[maxn];
  12.  
  13. struct node{
  14. int ch[],root,data;
  15. }T[maxn*];
  16.  
  17. int fast_pow(int now,int pw){
  18. int res = ,bit = ,fun = now;
  19. while(bit <= pw){
  20. if(bit & pw) res = (1ll*res*fun)%mod;
  21. fun = (1ll*fun*fun)%mod; bit<<=;
  22. }
  23. return res;
  24. }
  25.  
  26. int merge(int p1,int p2){return ((1ll*p1*(-p2)+1ll*p2*(-p1))%mod+mod)%mod;}
  27.  
  28. void Query(int now,int tl,int tr,int l,int r){
  29. int pls = T[now].root,ll = tl,rr = n;
  30. while(true){
  31. int mid = (ll+rr)/;
  32. ans = merge(ans,(-T[pls].data+mod)%mod);
  33. if(mid >= r){
  34. if(!T[pls].ch[]) break;
  35. else pls = T[pls].ch[];
  36. rr = mid;
  37. }else{
  38. if(!T[pls].ch[]) break;
  39. else pls = T[pls].ch[];
  40. ll = mid+;
  41. }
  42. }
  43. int mid = (tl+tr)/;
  44. if(mid >= l){if(T[now].ch[])Query(T[now].ch[],tl,mid,l,r);}
  45. else{if(T[now].ch[])Query(T[now].ch[],mid+,tr,l,r);}
  46. }
  47.  
  48. void M2(int now,int tl,int tr,int data){
  49. if(tl >= yL && tr <= yR){
  50. T[now].data = merge(T[now].data,data);
  51. return;
  52. }
  53. int mid = (tl+tr)/;
  54. if(!T[now].ch[] && !T[now].ch[]){
  55. T[now].ch[] = ++num; T[now].ch[] = ++num;
  56. T[num-].data = ; T[num].data = ;
  57. }
  58. if(mid >= yL) M2(T[now].ch[],tl,mid,data);
  59. if(mid < yR) M2(T[now].ch[],mid+,tr,data);
  60. }
  61.  
  62. void Modify(int now,int tl,int tr,int data){
  63. if(tl >= xL && tr <= xR){
  64. M2(T[now].root,tl,n,data);
  65. return;
  66. }
  67. int mid = (tl+tr)/;
  68. if(mid >= xL){
  69. if(T[now].ch[]==){
  70. num++;T[now].ch[] = num;
  71. num++;T[num-].root = num;T[num].data = ;
  72. }
  73. Modify(T[now].ch[],tl,mid,data);
  74. }
  75. if(mid < xR){
  76. if(T[now].ch[]==){
  77. num++;T[now].ch[] = num;
  78. num++;T[num-].root = num;T[num].data = ;
  79. }
  80. Modify(T[now].ch[],mid+,tr,data);
  81. }
  82. }
  83.  
  84. void read(){
  85. T[].root = ; T[].data = ;
  86. scanf("%d%d",&n,&m);
  87. for(int i=;i<=m;i++) scanf("%d%d%d",&Q[i].cas,&Q[i].l,&Q[i].r);
  88. }
  89.  
  90. void work(){
  91. int cnt = ;
  92. for(int i=;i<=m;i++){
  93. if(Q[i].cas == ){
  94. cnt^=; xL = ,xR = Q[i].l-,yL = Q[i].l,yR = Q[i].r;
  95. Modify(,,n,fast_pow(Q[i].r-Q[i].l+,mod-));
  96. xL = Q[i].l,xR = Q[i].r,yL = Q[i].l,yR = Q[i].r;
  97. Modify(,,n,*fast_pow(Q[i].r-Q[i].l+,mod-)%mod);
  98. xL = Q[i].l,xR = Q[i].r,yL = Q[i].r+,yR = n;
  99. Modify(,,n,fast_pow(Q[i].r-Q[i].l+,mod-));
  100. }else{
  101. ans = ; Query(,,n,Q[i].l-,Q[i].r);
  102. if((Q[i].l == && (!cnt))||Q[i].l != ) printf("%d\n",ans);
  103. else printf("%d\n",(-ans+mod)%mod);
  104. }
  105. }
  106. }
  107.  
  108. int main(){
  109. read();
  110. work();
  111. return ;
  112. }

LOJ2251 [ZJOI2017] 树状数组【线段树】【树套树】的更多相关文章

  1. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  3. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  4. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  5. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  6. 树状数组&线段树

    先是树状数组. 令这棵树的结点编号为C1,C2...Cn.令每个结点的值为这棵树的值的总和,那么容易发现: C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 ...

  7. 【bzoj4785】[Zjoi2017]树状数组 线段树套线段树

    题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作 ...

  8. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

  9. BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...

  10. BZOJ 3333 排队计划 树状数组+线段树

    题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...

随机推荐

  1. H5 34-背景图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 利用tushare进行对兴业银行股价的爬取,并使用numpy进行分析

    import sysimport tushare as tsimport numpy as npdata=ts.get_h_data('601066')print(data)#读出兴业银行7列数据da ...

  3. java 8中抽象类与接口的异同

    1.java 8中抽象类与接口的异同 相同点: 1)都是抽象类型: 2)都可以有实现方法(以前接口不行): 3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实 ...

  4. Django model操作

    一.各种查询统计操作   def all(self) # 获取所有的数据对象 def filter(self, *args, **kwargs) # 条件查询 # 条件可以是:参数,字典,Q def ...

  5. 【学习总结】Git学习-参考廖雪峰老师教程八-使用GitHub

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  6. 《Effective C++》资源管理:条款13-条款17

    条款13:以对象管理资源 为了防止资源泄漏,请使用RAII(Resource Acquisition Is Initialization)对象,在构造函数里面获得资源,在析构函数里面释放资源 auto ...

  7. Eclipse导入工程后出现中文乱码

    Eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的.一般默认都是UTF-8或者GBK,当从外部导入的一个工程时,如果该工程的编码方式与eclipse中设置的编码方式不同 ...

  8. 关于手机端适配的问题(rem,页面缩放)

    关于手机端适配的问题(rem,页面缩放) 96 进击的小前端 关注 2018.02.02 13:57 字数 320 阅读 19评论 0喜欢 0 相信很多和会和我碰到一样的情况,就是你用rem去写移动端 ...

  9. 关于wordpress更新提示无法创建目录问题

    说说自己的看法和解决办法 看法: 网上很多人说:是权限问题,那么将文件目录权限设置为777就可以解决.恩,没错,是可以解决更新问题,可是却带来了更大的问题——安全.像他们这个设置后,网站被攻破,数据被 ...

  10. zabbix添加监控Mysql

    起因:zabbix自带的mysql监控模板直接使用会显示“不支持的”因为key的值是通过Mysql用户查看"show global status"信息或者用mysqladmin命令 ...