传送门

KDTree

修改权值当做插入节点,不平衡就暴力重构,询问的时候判断当前节点代表的矩形是否在询问的矩形的,是的话返回答案,相离返回0,否则的话判断当前点是否在矩形内,然后继续递归下去

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. char buf[1<<21],*p1=buf,*p2=buf;
  11. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  12. int read(){
  13. R int res,f=1;R char ch;
  14. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  15. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  16. return res*f;
  17. }
  18. char sr[1<<21],z[20];int C=-1,Z=0;
  19. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  20. void print(R int x){
  21. if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
  22. while(z[++Z]=x%10+48,x/=10);
  23. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  24. }
  25. const int N=2e5+5;
  26. struct point{int v[2],w;}pool[N];
  27. struct node{int mn[2],mx[2],sum,l,r,sz;point tp;}tr[N];
  28. int n,m,K,rt,top,cnt,st[N],ans;
  29. inline bool operator <(const point &a,const point &b){return a.v[K]<b.v[K];}
  30. inline int newnode(){return top?st[top--]:++cnt;}
  31. void upd(int p){
  32. int l=tr[p].l,r=tr[p].r;
  33. fp(i,0,1){
  34. tr[p].mn[i]=tr[p].mx[i]=tr[p].tp.v[i];
  35. if(l)cmin(tr[p].mn[i],tr[l].mn[i]),cmax(tr[p].mx[i],tr[l].mx[i]);
  36. if(r)cmin(tr[p].mn[i],tr[r].mn[i]),cmax(tr[p].mx[i],tr[r].mx[i]);
  37. }tr[p].sum=tr[l].sum+tr[r].sum+tr[p].tp.w,tr[p].sz=tr[l].sz+tr[r].sz+1;
  38. }
  39. int build(int l,int r,int k){
  40. if(l>r)return 0;int mid=(l+r)>>1,p=newnode();
  41. K=k,nth_element(pool+l,pool+mid,pool+r+1),tr[p].tp=pool[mid];
  42. tr[p].l=build(l,mid-1,k^1),tr[p].r=build(mid+1,r,k^1);
  43. upd(p);return p;
  44. }
  45. void pia(int p,int sum){
  46. if(tr[p].l)pia(tr[p].l,sum);
  47. pool[sum+tr[tr[p].l].sz+1]=tr[p].tp,st[++top]=p;
  48. if(tr[p].r)pia(tr[p].r,sum+tr[tr[p].l].sz+1);
  49. }
  50. void ck(int &p,int k){
  51. if(tr[p].sz*0.75<tr[tr[p].l].sz||tr[p].sz*0.75<tr[tr[p].r].sz)
  52. pia(p,0),p=build(1,tr[p].sz,k);
  53. }
  54. void ins(int &p,point res,int k){
  55. if(!p)return (void)(p=newnode(),tr[p].l=tr[p].r=0,tr[p].tp=res,upd(p));
  56. res.v[k]<=tr[p].tp.v[k]?ins(tr[p].l,res,k^1):ins(tr[p].r,res,k^1);
  57. upd(p),ck(p,k);
  58. }
  59. inline bool in(int x1,int y1,int x2,int y2,int X1,int Y1,int X2,int Y2){
  60. return x1<=X1&&y1<=Y1&&x2>=X2&&y2>=Y2;
  61. }
  62. inline bool out(int x1,int y1,int x2,int y2,int X1,int Y1,int X2,int Y2){
  63. return x1>X2||x2<X1||y1>Y2||y2<Y1;
  64. }
  65. int query(int p,int x1,int y1,int x2,int y2){
  66. if(!p)return 0;int res=0;
  67. if(in(x1,y1,x2,y2,tr[p].mn[0],tr[p].mn[1],tr[p].mx[0],tr[p].mx[1]))return tr[p].sum;
  68. if(out(x1,y1,x2,y2,tr[p].mn[0],tr[p].mn[1],tr[p].mx[0],tr[p].mx[1]))return 0;
  69. if(in(x1,y1,x2,y2,tr[p].tp.v[0],tr[p].tp.v[1],tr[p].tp.v[0],tr[p].tp.v[1]))res+=tr[p].tp.w;
  70. res+=query(tr[p].l,x1,y1,x2,y2)+query(tr[p].r,x1,y1,x2,y2);return res;
  71. }
  72. int main(){
  73. // freopen("testdata.in","r",stdin);
  74. n=read();int op,x1,y1,x2,y2;
  75. while(true){
  76. op=read();if(op==3)break;
  77. if(op==1)ins(rt,(point){read()^ans,read()^ans,read()^ans},0);
  78. else{
  79. x1=read()^ans,y1=read()^ans,x2=read()^ans,y2=read()^ans;
  80. ans=query(rt,x1,y1,x2,y2),print(ans);
  81. }
  82. }return Ot(),0;
  83. }

P4148 简单题(KDTree)的更多相关文章

  1. 洛谷 P4148 简单题 KD-Tree 模板题

    Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...

  2. 洛谷 P4148 简单题 解题报告

    P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...

  3. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  4. 【BZOJ4066】简单题 KDtree

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

  5. bzoj4066: 简单题 K-Dtree

    bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...

  6. luogu P4148 简单题

    传送门 这题真简单,直接把\(CDQ\)给ban掉了 其实数据范围比较小可以直接二维树状数组,我们看数据范围,发现点的个数比N还小,可以考虑用一些奇怪的数据结构 说的就是你,\(KD tree\) \ ...

  7. Luogu P4148 简单题(K-D Tree)

    题面 题解 因为强制在线,所以我们不能$cdq$分治,所以考虑用$KDT$,$KDT$维护一个矩阵,然后询问的时候如果当前矩形在询问区间内,直接记贡献,否则判断当前点是否在矩阵内,然后左右分别递归下去 ...

  8. bzoj 4066 简单题——KDtree(带重构)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 带部分重构的KDtree.就是那个替罪羊树思想的. 写了对拍,调了半天,发现忘了 re ...

  9. 【bzoj4066】简单题 KD-tree

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

随机推荐

  1. BZOJ4555求和(cdq分治+NTT)

    题意: 输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果.1 ≤ n ≤ 100000 其中S(i,j)是第二类Stirling数,即有i个球,丢到j个盒子中,要求盒子不 ...

  2. Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)

    内核的shmall和shmmax参数 SHMMAX=配置了最大的内存segment的大小:这个设置的比SGA_MAX_SIZE大比较好. SHMMIN=最小的内存segment的大小 SHMMNI=整 ...

  3. 支付宝移动支付之IOSApp调用支付宝钱包

    近期客户提出要开发一个IOS上的app作为訪问他们站点的途径之中的一个.为什么说之中的一个呢.因为眼下PC和Mobile这两个站眼下都已经上线了. 所以问题就简单了,我们仅仅须要把mobile站UI改 ...

  4. Office EXCEL 创建图片超链接打不开怎么办 Excel打开图片提示发生了意外错误怎么办

    如下图所示,点击超链接提示无法打开指定的文件   如果使用Office打开,则提示发生了意外错误   你需要先把IE浏览器打开,这样就可以打开了,并非是图像的相对位置不正确导致的.      

  5. Project Euler:Problem 61 Cyclical figurate numbers

    Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers are all figurate (polygon ...

  6. LoadRunner系列之—-03 用Java Vuser协议编写接口测试脚本

    待测试接口用java语言实现,且项目中调用该接口需要用专门的jar包.这种情况可以用Java Vuser协议实现接口调用脚本,类似java代码. 代码样例如下: /* * LoadRunner Jav ...

  7. CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏

    CASE函数   作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...

  8. wsdl2objc定制(一)namespace

    1.问题抛出: 如今还是有非常多人使用 wsdl2objc 来调用webservice,可是有时候会有不开心的事情发生, <soap:Envelope xmlns:soap="http ...

  9. mysql学习笔记之mysql数据库的安装

    1.执行mysql安装包选择自己定义安装(安装路径不要带中文,否则安装会出错! ) 2.一个mysql想要操作成功须要有三部分:server端,数据段,数据. 3.server软件文件夹: 4.数据文 ...

  10. Highcharts报表——让你的网页上图表画的飞起

    Highcharts是一款纯javascript编写的图表库,能够很简单便捷的在Web网站或Web应用中添加交互性的图表,Highcharts目前支持直线图.曲线图.面积图.柱状图.饼图.散点图等多达 ...