题解:

前一题不是强制在线,后一题是强制在线

树套树空间会炸

说一下cdq分治+树状数组

首先我们利用cdq分治使得查询和操作保证先后关系

然后矩阵查询变成4个矩阵的差

那么我们就可以运用扫描线的方法来维护了

时间nlogn^2,空间O(n)

后一题是kd-tree

查询的方法和线段树基本一样

如果矩阵被包含就返回答案,如果不被包含就直接退出

否则递归下去

然后修改的话和替罪羊树一样

达到一定时候就重构

注意一下x相同insert和build要保证y的顺序区分左右

另外学习了一下map中用struct作为key的方法 虽然这题完全不用用

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for (rint i=h;i<=t;i++)
  6. #define dep(i,t,h) for (rint i=t;i>=h;i--)
  7. #define mid ((h+t)/2)
  8. #define me(x) memset(x,0,sizeof(x))
  9. const int INF=2e9;
  10. const int N=6e6+1e4;
  11. char ss[<<],*A=ss,*B=ss;
  12. IL char gc()
  13. {
  14. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  15. }
  16. template<class T>void read(T &x)
  17. {
  18. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
  19. while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  20. }
  21. IL void umax(int &x,int y)
  22. {
  23. if (x<y) x=y;
  24. }
  25. IL void umin(int &x,int y)
  26. {
  27. if (x>y) x=y;
  28. }
  29. struct re{
  30. int d[],v;
  31. }p[N];
  32. int cmp_d,ans,rt,num;
  33. bool cmp(re x,re y)
  34. {
  35. return x.d[cmp_d]<y.d[cmp_d]||(x.d[cmp_d]==y.d[cmp_d]&&x.d[cmp_d^]<y.d[cmp_d^]);
  36. }
  37. struct kd
  38. {
  39. int Mx[N],My[N],Nx[N],Ny[N],count2[N],ls[N],rs[N];
  40. IL void clear()
  41. {
  42. me(count2);
  43. me(ls); me(rs);
  44. }
  45. IL void updata(int x)
  46. {
  47. count2[x]=count2[ls[x]]+count2[rs[x]]+p[x].v;
  48. if (ls[x])
  49. {
  50. umax(Mx[x],Mx[ls[x]]);
  51. umax(My[x],My[ls[x]]);
  52. umin(Nx[x],Nx[ls[x]]);
  53. umin(Ny[x],Ny[ls[x]]);
  54. }
  55. if (rs[x])
  56. {
  57. umax(Mx[x],Mx[rs[x]]);
  58. umax(My[x],My[rs[x]]);
  59. umin(Nx[x],Nx[rs[x]]);
  60. umin(Ny[x],Ny[rs[x]]);
  61. }
  62. }
  63. int build(int h,int t,int o)
  64. {
  65. cmp_d=o; nth_element(p+h,p+mid,p+t+,cmp);
  66. int x=mid;
  67. Mx[x]=Nx[x]=p[x].d[];
  68. My[x]=Ny[x]=p[x].d[];
  69. count2[x]=p[x].v;
  70. if (h!=x) ls[x]=build(h,mid-,o^); else ls[x]=;
  71. if (x!=t) rs[x]=build(mid+,t,o^); else rs[x]=;
  72. updata(x);
  73. return x;
  74. }
  75. void insert(int &k,int x,int y,int z,int o)
  76. {
  77. if (!k)
  78. {
  79. k=++num;
  80. Mx[num]=Nx[num]=p[num].d[];
  81. My[num]=Ny[num]=p[num].d[];
  82. count2[num]=p[num].v=z;
  83. return;
  84. }
  85. if (p[k].d[]==x&&p[k].d[]==y)
  86. {
  87. count2[k]+=z; p[k].v+=z; return;
  88. }
  89. if (!o)
  90. if (x<p[k].d[]||(x==p[k].d[]&&y<p[k].d[])) insert(ls[k],x,y,z,o^);
  91. else insert(rs[k],x,y,z,o^);
  92. else if (y<p[k].d[]||(y==p[k].d[]&&x<p[k].d[])) insert(ls[k],x,y,z,o^);
  93. else insert(rs[k],x,y,z,o^);
  94. updata(k);
  95. }
  96. void query(int k,int x1,int x2,int y1,int y2)
  97. {
  98. if (!k||Mx[k]<x1||Nx[k]>x2||My[k]<y1||Ny[k]>y2) return;
  99. if (x2>=Mx[k]&&Nx[k]>=x1&&y2>=My[k]&&Ny[k]>=y1)
  100. {
  101. ans+=count2[k]; return;
  102. }
  103. if (x1<=p[k].d[]&&p[k].d[]<=x2&&y1<=p[k].d[]&&p[k].d[]<=y2)
  104. ans+=p[k].v;
  105. query(ls[k],x1,x2,y1,y2); query(rs[k],x1,x2,y1,y2);
  106. }
  107. }kd;
  108. struct re1{
  109. int a,b;
  110. };
  111. struct cmp2
  112. {
  113. bool operator() (const re1 x,const re1 y)
  114. {
  115. if (x.a<y.a||(x.a==y.a&&x.b<y.b)) return(); else return();
  116. }
  117. };
  118. map<re1,int,cmp2> M;
  119. int main()
  120. {
  121. int m;
  122. freopen("1.in","r",stdin);
  123. freopen("1.out","w",stdout);
  124. read(m);
  125. int cnt=,rt=,i=;
  126. while ()
  127. {
  128. i++;
  129. ans=;
  130. int k;
  131. read(k);
  132. if (k==) break;
  133. if (k==)
  134. {
  135. int x,y,z;
  136. read(x); read(y); read(z);
  137. x^=ans; y^=ans; z^=ans;
  138. re1 k3=(re1){x,y};
  139. int kk=M[k3];
  140. if (!kk) p[num+].d[]=x,p[num+].d[]=y,kk=num+;
  141. M[k3]=kk;
  142. kd.insert(rt,x,y,z,);
  143. cnt++;
  144. if (cnt%==)
  145. {
  146. kd.clear();
  147. rt=kd.build(,num,);
  148. }
  149. } else
  150. {
  151. int x1,x2,y1,y2;
  152. read(x1),read(y1),read(x2),read(y2);
  153. x1^=ans,x2^=ans,y1^=ans,y2^=ans;
  154. ans=;
  155. kd.query(rt,x1,x2,y1,y2);
  156. cout<<ans<<endl;
  157. }
  158. }
  159.  
  160. return ;
  161. }

bzoj2683&&bzoj4066的更多相关文章

  1. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  2. [基本操作] kd 树

    概念就不说了吧,网上教程满天飞 学了半天才知道,kd 树实质上只干了两件事情: 1.快速定位一个点 / 矩形 2.有理有据地优化暴力 第一点大概是可以来做二维平面上给点/矩形打标记的问题 第二点大概是 ...

  3. Bzoj4066 简单题

    Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 2185  Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...

  4. BZOJ4066 简单题(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. 【bzoj4066】 简单题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4066 (题目链接) 题意 维护一个矩阵,两个操作,给某一个元素加上A,求其中一个子矩阵的元素之和.强 ...

  6. [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia

    [BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...

  7. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

  8. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

  9. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

随机推荐

  1. HttpResonse 要记得关闭

    写了一个小程序,要识别网站上的图片,用到HttpRequest发请求,HttpResponse接受返回数据.刚开始循环可以跑两个,但是总是提示超时.后来查资料发现,在Http协议中,规定了同个Http ...

  2. 微信小程序-WebSocket应用

    为何有 HTTP 协议还需要 WebSocket ? Http协议 有个缺陷:通信只能由客户端发起.举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果.HTTP 协议做不 ...

  3. 微信小程序采坑(一)

    1.微信小程序如何让text内容空格 <text decode="{{true}}" space="{{true}}">  </text> ...

  4. jQuery.extend()参数

    非原创,转载仅供学习 在处理插件参数的接收上,通常使用jQuery的extend方法.extend方法传递单个对象的情况下,这个对象会合并到jQuery身上,而当用extend方法传递一个以上的参数时 ...

  5. web缓存服务器varnish-4.1.6的部署及配置详解

    web缓存服务器varnish-4.1.6的部署及配置详解 1.安装varnish4.1.6安装依赖 yum install -y autoconf automake jemalloc-devel l ...

  6. python 基础 Two day

    1.格式化输出 %s   字符串 %d   数字 %%  转义 % %f   小数 现在有以下需求,让用户输入name, age, job,hobby 然后输出如下所示: ------------ i ...

  7. Laravel 5.2数据库--多个关联关系,带条件约束的渴求式加载的问题

    ### 今天在连表获取数据的时候,老是获取不到想要的,确实有点无力适从的感觉. 归根到底,还是对laravel不够熟悉,至少是数据库操作那块. ### 问题是这样的: 我想要通过连表中间表,拿中间表的 ...

  8. Java+selenium chrome 常见的问题WebDriverException: unknown error: call function result missing 'value'

    运行chrome浏览器 报错:"main" org.openqa.selenium.WebDriverException: unknown error: call function ...

  9. 19)django-cookie使用

    Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 一:cookie cookie在客户端浏览器的是以 ...

  10. 大数据python词频统计之本地分发-file

    统计某几个词在文章出现的次数 -file参数分发,是从客户端分发到各个执行mapreduce端的机器上 1.找一篇文章The_Man_of_Property.txt如下: He was proud o ...