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."(输出不含双引号)。

Sample Input

10 7
1 1 1 1
1 2 2 3
1 4 1 2
1 3 4 4
2 1 1 4 1 3
2 2 2 3 5 4
2 2 1 4 4 2

Sample Output

NAIVE!ORZzyz.
NAIVE!ORZzyz.
3
 
 
这名字……
线段树套k-d树,重构的话就把点全部拿出来建树再放回去。
#include<cstdio>
#include<algorithm>
#define MN 1400010
#define M 2000
using namespace std; int n,m,X,ro[MN],L[MN],R[MN],x,y,num=,nm=,x1,x2,y1,y2,root=,xx,o,MMH=,mmh[MN],st[MN],l,r;
struct tr{
int x,y;
friend bool operator<(tr a,tr b){
if (X) return a.x<b.x;else return a.y<b.y;
}
}a[MN],A[MN];
struct tree{
int xa,xi,ya,yi,l,r,si;
}t[MN],T[MN];
char cs;
inline int read(){
cs=getchar();xx=;
while(cs<''||cs>'') cs=getchar();
while(cs>=''&&cs<='') xx=xx*+cs-,cs=getchar();
return xx;
}
inline void in(int &p,bool b){
if (!p){
p=num;
t[p].l=t[p].r=;
t[p].xa=t[p].xi=a[num].x;
t[p].ya=t[p].yi=a[num].y;
t[p].si=;
return;
}
X=b;t[p].si++;
if (a[num]<a[p]) in(t[p].l,b^);else in(t[p].r,b^);
t[p].xa=max(t[p].xa,a[num].x);
t[p].xi=min(t[p].xi,a[num].x);
t[p].ya=max(t[p].ya,a[num].y);
t[p].yi=min(t[p].yi,a[num].y);
}
inline int build(int l,int r,int now){
X=now;
int mid=(l+r)>>;
nth_element(A+l,A+mid,A+r+);
T[mid].si=r-l+;
T[mid].xa=T[mid].xi=A[mid].x;
T[mid].ya=T[mid].yi=A[mid].y;
if (l<mid) T[mid].l=build(l,mid-,now^),
T[mid].xa=max(T[T[mid].l].xa,T[mid].xa),
T[mid].xi=min(T[T[mid].l].xi,T[mid].xi),
T[mid].ya=max(T[T[mid].l].ya,T[mid].ya),
T[mid].yi=min(T[T[mid].l].yi,T[mid].yi);else T[mid].l=;
if (mid<r) T[mid].r=build(mid+,r,now^),
T[mid].xa=max(T[T[mid].r].xa,T[mid].xa),
T[mid].xi=min(T[T[mid].r].xi,T[mid].xi),
T[mid].ya=max(T[T[mid].r].ya,T[mid].ya),
T[mid].yi=min(T[T[mid].r].yi,T[mid].yi);else T[mid].r=;
return mid;
}
inline int wout(int p){
st[l=r=]=p;
while(l<=r){
A[l]=a[st[l]];
if (t[st[l]].l) st[++r]=t[st[l]].l;
if (t[st[l]].r) st[++r]=t[st[l]].r;
l++;
}
l=build(,r,);
for (register int i=;i<=r;i++) t[st[i]]=T[i],a[st[i]]=A[i],t[st[i]].l=st[t[st[i]].l],t[st[i]].r=st[t[st[i]].r];
return st[l];
return p;
}
inline void insert(int &p,int l,int r,int v,bool b){
if (!p) p=++nm,mmh[p]=M;
if (b){
a[++num].x=x;a[num].y=y;in(ro[p],);
if (t[ro[p]].si==mmh[p]) mmh[p]+=M,ro[p]=wout(ro[p]);
}
if (l==r) return;
int mid=l+r>>;
if (v<=mid) insert(L[p],l,mid,v,);else insert(R[p],mid+,r,v,);
}
inline int ask(int p){
if (t[p].xa<=x2&&t[p].xi>=x1&&t[p].ya<=y2&&t[p].yi>=y1) return ;
if (t[p].xi>x2||t[p].xa<x1||t[p].yi>y2||t[p].ya<y1) return ;
return ;
}
inline bool inl(int p){
if (a[p].x>=x1&&a[p].x<=x2&&a[p].y>=y1&&a[p].y<=y2) return ;
return ;
}
inline int QUE(int p){
int mmh=ask(p);
if (!mmh) return ;
if (mmh==) return t[p].si;else{
if (inl(p)) mmh=;else mmh=;
if (t[p].l) mmh+=QUE(t[p].l);
if (t[p].r) mmh+=QUE(t[p].r);
}
return mmh;
}
inline int que(int p,int l,int r,int k){
if (l==r) return l;
int u=;if (R[p]) u=QUE(ro[R[p]]);
int mid=l+r>>;
if (u<k) return que(L[p],l,mid,k-u);else return que(R[p],mid+,r,k);
}
int main(){
register int i,k;
n=read();m=read();
for (i=;i<=m;i++){
o=read();
if (o==) x=MMH^read(),y=MMH^read(),insert(root,,1e9,MMH^read(),);else{
x1=MMH^read();y1=MMH^read();x2=MMH^read();y2=MMH^read();k=MMH^read();
if (QUE(ro[root])<k) printf("NAIVE!ORZzyz.\n",MMH=);else
printf("%d\n",MMH=que(root,,1e9,k));
}
}
}

126604 kb 24240 ms C++/Edit 3738 B

bzoj 4605: 崂山白花蛇草水的更多相关文章

  1. BZOJ 4605 崂山白花蛇草水(权值线段树+KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题目大意] 操作 1 x y k 表示在点(x,y)上放置k个物品, 操作 2 ...

  2. BZOJ4605:崂山白花蛇草水

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

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

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

  4. LG4848 崂山白花蛇草水

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

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

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

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

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

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

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

  8. 洛谷P4848 崂山白花蛇草水 权值线段树+KDtree

    题目描述 神犇 \(Aleph\) 在 \(SDOI\ Round2\) 前立了一个 \(flag\):如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 \(Aleph\) 的实力,他轻松地进了山 ...

  9. 【BZOJ 4605】崂山白花蛇草水 替罪羊树套线段树

    外层是借鉴了kd-tree的替罪羊里层是线段树,插入就是正常插入+拍扁重建,查询的时候,我们就像树状数组套线段树一样操作在替罪羊中找到的线段树根节点,但是对于在kd-tree查找过程中遇到的单点,我们 ...

随机推荐

  1. bzoj 1486: [HNOI2009]最小圈

    Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 Sample Output 3.66666667 HIN ...

  2. JS中数组的方法

    1. join() Array.join() 是 String.split() 的逆向操作 var arr = [1, 2, 3] arr.join()// "1,2,3" arr ...

  3. node基础篇二:模块、路由、全局变量课堂(持续)

    今天继续更新node基础篇,今天主要内容是模块.路由和全局变量. 模块这个概念,在很多语言中都有,现在模块开发已经成为了一种潮流,它能够帮助我们节省很多的时间,当然咱们的node自然也不能缺少,看下例 ...

  4. Collection源码图

    java基础是否扎实,在于多读源码,比如集合 IO Socket 多线程并发包等 最近将集合框架的源码读了以下,总结了一些,下图所示

  5. u3d之世界坐标系,屏幕坐标系,视口坐标系,如何获取物体距离摄像机的距离

    世界坐标系就是unity的左手坐标系 屏幕坐标系是Game视图相机拍摄的场景坐标系,左下角(0,0),右上角(Screen.width,Screen.height),单位是像素.Z的位置是以相机的世界 ...

  6. Linux的编码及编码转换

    如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Li ...

  7. Vuex 源码学习(二)

    Vue加载后,将Vuex 加载到 Vue对象上后,初始化Store. (一) Store的参数的定义 其中 action 与 mutation 的订阅者 用 数组存储,而其属性都是用对象存储的. 考虑 ...

  8. class, classloder, dex 详解

    class与dex文件 什么是class文件 class文件是一种能够被JVM识别,加载并且执行的文件格式. class文件的作用 class文件的作用是记录一个类文件的所有信息. 例如记住了当前类的 ...

  9. python导入模块时的执行顺序

    当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这个mo ...

  10. Kotlin——最详细的操作符与操作符重载详解(上)

    本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...