【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4605

【题目大意】

  操作 1 x y k 表示在点(x,y)上放置k个物品,
  操作 2 x0 y0 x1 y1 k 表示查询矩形内放置物品第k多的格子有几个物品
  同一个格子不会被同时放置物品一次以上

【题解】

  内层用替罪羊式的KD树动态维护加点,和查询矩形内点数
  外层用权值线段树维护KD树的权值编号
  对于每个权值点,添加到权值线段树查询路径上的每一颗KD树上,
  这样就保证了区间的二进制拆分区间总可以被查询到

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=3000000,INF=1e9;
namespace KD_Tree{struct Dot{  int d[2],mn[2],mx[2],l,r,sz;  Dot(){l=r=0;}  Dot(int x,int y){d[0]=x;d[1]=y;l=r=0;}  int& operator [] (int x){return d[x];}  };  int D,dcnt=0;Dot T[N];inline void umax(int&a,int b){if(a<b)a=b;}inline void umin(int&a,int b){if(a>b)a=b;}inline bool cmp(int x,int y){return T[x][D]<T[y][D];}inline void up(int x){T[x].sz=T[T[x].l].sz+T[T[x].r].sz+1;T[x].mn[0]=T[x].mx[0]=T[x][0];  T[x].mn[1]=T[x].mx[1]=T[x][1]; if(T[x].l){umax(T[x].mx[0],T[T[x].l].mx[0]);umin(T[x].mn[0],T[T[x].l].mn[0]);   umax(T[x].mx[1],T[T[x].l].mx[1]);umin(T[x].mn[1],T[T[x].l].mn[1]);}if(T[x].r){umax(T[x].mx[0],T[T[x].r].mx[0]);umin(T[x].mn[0],T[T[x].r].mn[0]);umax(T[x].mx[1],T[T[x].r].mx[1]);umin(T[x].mn[1],T[T[x].r].mn[1]);}}inline int NewDot(int x,int y){++dcnt; T[dcnt][0]=x; T[dcnt][1]=y;return up(dcnt),dcnt;}int query(int x,int x0,int y0,int x1,int y1){if(!x||T[x].mn[0]>x1||T[x].mx[0]<x0||T[x].mn[1]>y1||T[x].mx[1]<y0)return 0;  if(T[x].mn[0]>=x0&&T[x].mx[0]<=x1&&T[x].mn[1]>=y0&&T[x].mx[1]<=y1)return T[x].sz;  int res=0;  if(T[x][0]>=x0&&T[x][0]<=x1&&T[x][1]>=y0&&T[x][1]<=y1)res++;  return res+query(T[x].l,x0,y0,x1,y1)+query(T[x].r,x0,y0,x1,y1); }int tot=0,pt[N]; int gt,gtd,gtf;const double alp=0.8;inline bool isbad(int x){  return max(T[T[x].l].sz,T[T[x].r].sz)>T[x].sz*alp+5;  }void ins(int&x,int D,const Dot&p){  if(!x){x=NewDot(p.d[0],p.d[1]);return;}  if(p.d[D]<T[x][D])ins(T[x].l,D^1,p);  else ins(T[x].r,D^1,p);  up(x);  if(isbad(x))gt=x,gtd=D,gtf=0;  else if(gt==T[x].l||gt==T[x].r)gtf=x;  }void treavel(int&x){  if(!x)return;  pt[++tot]=x;  treavel(T[x].l),treavel(T[x].r);  }int build(int l,int r,int now){  if(l>r)return 0;  int mid=(l+r)>>1,x;  D=now;  nth_element(pt+l,pt+mid,pt+r+1,cmp);  x=pt[mid];  T[x].l=build(l,mid-1,now^1);  T[x].r=build(mid+1,r,now^1);  return up(x),x;  } void Insert(int&x,const Dot&p){  gt=gtf=0,ins(x,0,p);  if(!gt)return;  tot=0,treavel(gt);  if(!gtf){x=build(1,tot,gtd);return;}  if(gt==T[gtf].l)T[gtf].l=build(1,tot,gtd);  else T[gtf].r=build(1,tot,gtd);  }
}
int tot=0;
struct data{int rt,l,r;}T[N];
void Insert(int &x,const KD_Tree::Dot&p,int val,int l=1,int r=INF){if(!x)x=++tot;KD_Tree::Insert(T[x].rt,p);if(l==r)return;int mid=(l+r)>>1;if(val<=mid)Insert(T[x].l,p,val,l,mid);else Insert(T[x].r,p,val,mid+1,r);
}
int query(int x,int x0,int y0,int x1,int y1,int k,int l=1,int r=INF){  if(l==r)return l;  int rcnt=KD_Tree::query(T[T[x].r].rt,x0,y0,x1,y1);  int mid=(l+r)>>1;  if(k<=rcnt)return query(T[x].r,x0,y0,x1,y1,k,mid+1,r);  return query(T[x].l,x0,y0,x1,y1,k-rcnt,l,mid);
}
int n,q,op,x0,y0,x1,y1,k,root=0,ans=0;
int main(){scanf("%d%d",&n,&q);while(q--){scanf("%d",&op);if(op==1){scanf("%d%d%d",&x0,&y0,&k);x0^=ans,y0^=ans,k^=ans;KD_Tree::Dot p=KD_Tree::Dot(x0,y0);Insert(root,p,k);}else{scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&k);x0^=ans,y0^=ans,x1^=ans,y1^=ans,k^=ans;int res=KD_Tree::query(T[root].rt,x0,y0,x1,y1);if(res<k)puts("NAIVE!ORZzyz."),ans=0;  else printf("%d\n",ans=query(root,x0,y0,x1,y1,k));  }}return 0;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj4605.html

BZOJ 4605 崂山白花蛇草水(权值线段树+KD树)相关推荐

  1. BZOJ 4605 崂山白花蛇草水 权值线段树+K-D树

    Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履行诺言的时 ...

  2. 崂山白花蛇草水 权值线段树套KDtree

    崂山白花蛇草水 权值线段树套KDtree Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻 ...

  3. bzoj4605: 崂山白花蛇草水 权值线段树套KDtree

    bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...

  4. 【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree

    [BZOJ4605]崂山白花蛇草水 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了 ...

  5. 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree

    题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob ...

  6. bzoj4605 崂山白花蛇草水 权值线段树套kd树

    Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...

  7. BZOJ 4605: 崂山白花蛇草水 树套树 权值线段树套kdtree

    4605: 崂山白花蛇草水 Time Limit: 80 Sec  Memory Limit: 512 MB Submit: 527  Solved: 153 [Submit][Status][Dis ...

  8. [BZOJ]4605 崂山白花蛇草水 线段树套KD-Tree

    4605: 崂山白花蛇草水 Time Limit: 80 Sec  Memory Limit: 512 MB Submit: 527  Solved: 153 [Submit][Status][Dis ...

  9. bzoj 4605 崂山白花蛇草水

    http://www.elijahqi.win/archives/3722 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水. ...

最新文章

  1. Java并发基础:了解无锁CAS就从源码分析 1
  2. 【Python】Effective Python 读书笔记
  3. app android de,Android Deobfuscation
  4. (19)FPGA脉冲计数器设计(第4天)
  5. centos7.6内核升级
  6. 使用python命令行参数sys.argv 做bat脚本
  7. ionic3 图片(轮播)预览 ionic-gallary-modal组件使用方法
  8. 【leetcode 简单】第三十八题 两数之和 II - 输入有序数组
  9. 一网打尽 SCI、SCIE、SSCI 、EI等指标及影响因子查询
  10. Mat转QImage
  11. 为什么Web前端工程师薪资越来越高?
  12. PTA:特立独行的幸福
  13. 首发速看:智微JMS901双接口U盘成功量产,附量产工具软件+固件+教程分享
  14. 【图深度学习】简单图的定义以及各类衍生图
  15. Springboot 整合 阿里云消息队列RabbitMQ版服务
  16. Codeforces 1324 D. Pair of Topics(二分)
  17. 【硬件】机器人平台搭建
  18. luogu P2698 [USACO12MAR]花盆Flowerpot
  19. 显微镜下的白细胞 捉到一群正在撒欢de小可爱,哇哇~
  20. Mockito的使用

热门文章

  1. UNIX的spctl命令
  2. 解决element-ui对话框组件el-dialog遮罩层小问题
  3. 区块链在物联网中的应用
  4. ros3。3教程 入门到高级
  5. 数据结构----各种排序方法总结
  6. php如何每三位逗号分开,PHP 数字格式化,数字每三位加逗号的简单示例
  7. php h5页面微信登录页面,客户端,微信内置浏览器加载H5页面字体变大问题
  8. 计【思考】如不解决这些问题,山东招远这类事情以后仍然会不断发生!!
  9. 梅森素数、猜年龄、啤酒饮料、武功秘籍、调和级数、李白打酒、猜字母、扩散、三升序列、寻找2020
  10. 实验8.4 有理数比较