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

Description

神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水。凭借着神犇Aleph的实
力,他轻松地进了山东省省队,现在便是他履行诺言的时候了。蒟蒻Bob特地为他准备了999,999,999,999,999,999
瓶崂山白花蛇草水,想要灌神犇Aleph。神犇Aleph求(跪着的)蒟蒻Bob不要灌他,由于神犇Aleph是神犇,蒟蒻Bo
b最终答应了他的请求,但蒟蒻Bob决定将计就计,也让神犇Aleph回答一些问题。具体说来,蒟蒻Bob会在一个宽敞
的广场上放置一些崂山白花蛇草水(可视为二维平面上的一些整点),然后询问神犇Aleph在矩形区域(x1, y1), (
x2, y2)(x1≤x2且y1≤y2,包括边界)中,崂山白花蛇草水瓶数第k多的是多少。为了避免麻烦,蒟蒻Bob不会在同
一个位置放置两次或两次以上的崂山白花蛇草水,但蒟蒻Bob想为难一下神犇Aleph,希望他能在每次询问时立刻回
答出答案。神犇Aleph不屑于做这种问题,所以把这个问题交给了你。

Input

输入的第一行为两个正整数N, Q,表示横纵坐标的范围和蒟蒻Bob的操作次数(包括放置次数和询问次数)。
接下来Q行,每行代表蒟蒻Bob的一个操作,操作格式如下:
首先第一个数字type,表示操作种类。type=1表示放置,type=2表示询问。
若type=1,接下来会有三个正整数x, y, v,表示在坐标整点(x, y)放置v瓶崂山白花蛇草水。(1≤x, y≤N, 1≤v≤10^9)
若type=2,接下来会有五个正整数x1, y1, x2, y2, k,表示询问矩形区域(x1, y1), (x2, y2)中,崂山白花蛇草水瓶数第k多的是多少。
(1≤x1≤x2≤N,1≤y1≤y2≤N,1≤k≤Q)
为了体现程序的在线性,你需要将每次读入的数据(除了type值)都异或lastans,其中lastans表示上次询问的答
案。如果上次询问的答案为"NAIVE!ORZzyz."(见样例输出),则将lastans置为0。初始时的lastans为0。
初始时平面上不存在崂山白花蛇草水。
本题共有12组测试数据。对于所有的数据,N≤500,000。
Q的范围见下表:
测试点1-2     Q=1,000
测试点3-7     Q=50,000
测试点8-12     Q=100,000

Output

对于每个询问(type=2的操作),回答崂山白花蛇草水瓶数第k多的是多少。若不存在第k多的瓶数,
请输出"NAIVE!ORZzyz."(输出不含双引号)。
外层一个权值线段树来二分权值,线段树中每个节点开一颗 KDtree 来数点,这么边数点边二分即可.

Code:

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) //,freopen(s".out","w",stdout)
struct Data
{int ch[2],w,minv[2],maxv[2],p[2],siz,sum;
}node[20000000], arr[20000000];
namespace KDtree
{#define maxn 20000000#define Min(a,b) (a = a>b?b:a) #define Max(a,b) (a = b>a?b:a) int d,c_arr;    std::queue<int>Q; void Init(){for(int i=1;i<maxn;++i) Q.push(i);                } int newnode(){ int q = Q.front(); Q.pop(); return q; }bool cmp(Data i,Data j){      return i.p[d]==j.p[d]?i.p[d^1]<j.p[d^1]:i.p[d]<j.p[d]; }bool isout(int k,int x1,int y1,int x2,int y2){if(node[k].maxv[0]<x1||node[k].minv[0]>x2||node[k].maxv[1]<y1||node[k].minv[1]>y2) return 1; return 0; }bool isin(int k,int x1,int y1,int x2,int y2){if(node[k].maxv[0]<=x2 && node[k].minv[0]>=x1&&node[k].maxv[1]<=y2&&node[k].minv[1]>=y1) return 1; return 0; }void pushup(int x,Data p){node[x].sum+=p.sum;node[x].siz+=p.siz; Min(node[x].minv[0],p.minv[0]); Min(node[x].minv[1],p.minv[1]); Max(node[x].maxv[0],p.maxv[0]); Max(node[x].maxv[1],p.maxv[1]); }int query(int x,int x1,int y1,int x2,int y2){if(!x||isout(x,x1,y1,x2,y2)) return 0; if(isin(x,x1,y1,x2,y2))  {return node[x].sum; }int ans=0; if(node[x].p[0]>=x1&&node[x].p[0]<=x2&&node[x].p[1]>=y1&&node[x].p[1]<=y2) ans=1; ans += query(node[x].ch[0],x1,y1,x2,y2)+query(node[x].ch[1],x1,y1,x2,y2); return ans; } void dfs(int &o){if(!o) return; dfs(node[o].ch[0]);arr[++c_arr] = node[o];arr[c_arr].sum=arr[c_arr].w=1; arr[c_arr].maxv[0]=arr[c_arr].minv[0]=arr[c_arr].p[0]; arr[c_arr].maxv[1]=arr[c_arr].minv[1]=arr[c_arr].p[1]; arr[c_arr].siz=1;      Q.push(o);dfs(node[o].ch[1]); o=0; }   void rebuild(int &x,int l,int r,int o){int mid=(l+r)>>1; d=o,std::nth_element(arr+l,arr+mid,arr+1+r,cmp); x=newnode(); node[x]=arr[mid]; node[x].minv[0]=node[x].maxv[0]=node[x].p[0]; node[x].minv[1]=node[x].maxv[1]=node[x].p[1]; node[x].sum=node[x].w=1;  node[x].ch[0]=node[x].ch[1]=0;node[x].siz=1; if(l<mid) rebuild(node[x].ch[0],l,mid-1,o^1), pushup(x, node[node[x].ch[0]]); if(r>mid) rebuild(node[x].ch[1],mid+1,r,o^1), pushup(x, node[node[x].ch[1]]); } void Reconstruct(int &u){c_arr=0; dfs(u); rebuild(u,1,c_arr,d=0);       } bool check(int son,int x){ if(son*10>x*9) return true; return false; }void insert(int &x,Data a,int de,int tag){if(!x){x=newnode(); node[x].p[0]=node[x].maxv[0]=node[x].minv[0]=a.p[0]; node[x].p[1]=node[x].maxv[1]=node[x].minv[1]=a.p[1]; node[x].sum=node[x].w=1;node[x].siz=1,node[x].ch[0]=node[x].ch[1]=0; return; }d = de;int is=0;          if(cmp(a,node[x]) == 1)          {                    is = check(node[node[x].ch[0]].siz+1,node[x].siz+1);insert(node[x].ch[0],a,de^1,is||tag);pushup(x,a); }//a is bigger (rson) else {is = check(node[node[x].ch[1]].siz+1,node[x].siz+1);insert(node[x].ch[1],a,de^1,is||tag);pushup(x,a); }      if(tag && is) Reconstruct(x);   }
};
#define y1 opopopop
int lson[2000000],rson[2000000],rt[2000000];
int x1,y1,x2,y2, tot=0,root=0;
void modify(int &x,int l,int r,int k,Data i)
{   if(!x) x = ++tot;           KDtree::insert(rt[x],i,0,0);                  if(l==r) return;         int mid = (l+r)>>1; if(k <= mid) modify(lson[x],l,mid,k,i); else modify(rson[x],mid+1,r,k,i);
}
int query(int x,int l,int r,int kth)
{              if(l==r) return l; int u = KDtree::query(rt[rson[x]],x1,y1,x2,y2);                     int mid = (l + r) >> 1;             if(u < kth) return query(lson[x],l,mid,kth-u);  else return query(rson[x],mid+1,r,kth);
}
int Query(int kth)
{    return query(root,0,1000000000,kth);
}
int n,q,lastans=0;
int main()
{// setIO("input"); KDtree::Init();  scanf("%d%d",&n,&q);            for(int cc=1;cc<=q;++cc)   {int opt,a,b,c,d; scanf("%d",&opt); if(opt==1){    scanf("%d%d%d",&a,&b,&c);     a^=lastans,b^=lastans,c^=lastans; Data f; f.p[0]=f.maxv[0]=f.minv[0]=a;f.p[1]=f.maxv[1]=f.minv[1]=b; f.ch[0]=f.ch[1]=0; f.siz=1;    f.sum=f.w=1;                 modify(root,0,1000000000,c,f);   }if(opt==2){scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&a); x1^=lastans,y1^=lastans,x2^=lastans,y2^=lastans,a^=lastans;             lastans = Query(a); if(lastans==0)   printf("NAIVE!ORZzyz.\n");   else  printf("%d\n",lastans); }}return 0;
}

  

posted @ 2019-06-01 14:17 EM-LGH 阅读(...) 评论(...) 编辑 收藏

崂山白花蛇草水 权值线段树套KDtree相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. bzoj4605: 崂山白花蛇草水(权值线段树套k-dtree)

    题目 #include<bits/stdc++.h> using namespace std; #define mid (l+r>>1) const int N=100002, ...

  8. 刷题总结——序列操作(权值线段树套树状数组)

    题目: 题目描述 给出序列 a1,a2,-,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,-,ar(1≤l≤r≤n)第 ...

  9. 【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 之前没怎么接触过权值线段树(非主席树),这次就当学习了一下吧.一开始还把题意理解错了,我的 ...

最新文章

  1. PPLcnet和YOLO的碰撞,真的能在cpu上快到起飞?
  2. 中英文最大AI模型世界纪录产生,大模型竞赛新阶段来了
  3. 13种老人不适合带孩子_这十三种老人不适宜带孩子,亲爹亲妈们慎重!
  4. 《ASP.NET MVC企业实战》(二) MVC开发前奏
  5. jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表
  6. mysql profiling_MySQL Profiling 的使用
  7. centos7 mysql
  8. sharepoint获取当前网址
  9. 在IDEA集成Github
  10. centos ssh配置使用
  11. 状态机finite-state machine学习笔记2——按键消抖初步(1)
  12. UCI数据集介绍(论文常用数据集)
  13. Symbian s40 Java编程实战(一)--开发环境配置
  14. 2018上半年掘金微信群日报优质文章合集:前端篇
  15. CDA数据分析师教材与题库
  16. c语言 最大子段和,最大子段和 C语言源码
  17. photoshop 大作业
  18. 网站推广教程(SEO,优化)100条
  19. mysql 内置函数大全 mysql内置函数大全
  20. 拥塞控制算法(Congestion Control)对比

热门文章

  1. 在线选课系统UML大作业
  2. 兔老大的系统设计(一)健康度系统
  3. 原生爬虫爬取虎牙绝地求生直播热度排行榜
  4. html 修改浏览器图标大小设置,如何在网页中插入、编辑图像和调整其大小
  5. 用户输入查询与拼音首字母的结合,提高用户的操作体验
  6. FPGA HLS 卷积神经网络软硬件映射
  7. 【安装系统】U盘安装系统教程,使用UltraISO制作U盘启动盘
  8. 【8019】俞军给淘宝产品经理的分享
  9. python实现数组的全组合以及全排列
  10. Android中Wi-Fi扫描、连接和信息(一)