BZOJ4605 : 崂山白花蛇草水
外层维护权值线段树,内层维护kd-tree。
修改的时候只往右儿子里插入,不平衡的时候替罪羊式重构。
查询的时候在外层线段树上走,在内层kd-tree上查询矩形内点数即可。
时间复杂度$O(q\log v(\log^2q+\sqrt{q}))$。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const double A=0.8;
const int N=100010,M=1600010;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int n,ans,cmp_d,op,X1,Y1,X2,Y2,k;
int tmp[N],deep,need[N],cnt,cur;
int T[M],l[M],r[M],tot=1;
struct node{int d[2],l,r,Max[2],Min[2],size;}t[M];
inline bool cmp(int a,int b){return t[a].d[cmp_d]<t[b].d[cmp_d];}
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 void up(int x){
t[x].size=1+t[t[x].l].size+t[t[x].r].size;
if(t[x].l){
umax(t[x].Max[0],t[t[x].l].Max[0]);
umin(t[x].Min[0],t[t[x].l].Min[0]);
umax(t[x].Max[1],t[t[x].l].Max[1]);
umin(t[x].Min[1],t[t[x].l].Min[1]);
}
if(t[x].r){
umax(t[x].Max[0],t[t[x].r].Max[0]);
umin(t[x].Min[0],t[t[x].r].Min[0]);
umax(t[x].Max[1],t[t[x].r].Max[1]);
umin(t[x].Min[1],t[t[x].r].Min[1]);
}
}
int build(int l,int r,int D){
int mid=(l+r)>>1;
cmp_d=D;
nth_element(need+l+1,need+mid+1,need+r+1,cmp);
int x=need[mid];
t[x].Max[0]=t[x].Min[0]=t[x].d[0];
t[x].Max[1]=t[x].Min[1]=t[x].d[1];
if(l!=mid)t[x].l=build(l,mid-1,!D);else t[x].l=0;
if(r!=mid)t[x].r=build(mid+1,r,!D);else t[x].r=0;
up(x);
return x;
}
void dfs(int x){if(x)need[++cnt]=x,dfs(t[x].l),dfs(t[x].r);}
inline void ins(int&root,int now){
if(!root){root=now;return;}
for(int D=deep=0,x=root;;D^=1){
tmp[++deep]=x;
umax(t[x].Max[0],t[now].Max[0]);
umax(t[x].Max[1],t[now].Max[1]);
umin(t[x].Min[0],t[now].Min[0]);
umin(t[x].Min[1],t[now].Min[1]);
t[x].size++;
if(t[now].d[D]>=t[x].d[D]){
if(!t[x].r){t[x].r=now;break;}else x=t[x].r;
}else{
if(!t[x].l){t[x].l=now;break;}else x=t[x].l;
}
}
tmp[++deep]=now;
if(deep<log(t[root].size)/log(1/A))return;
while((double)t[t[now].l].size<A*t[now].size&&(double)t[t[now].r].size<A*t[now].size)now=tmp[--deep];
if(!now)return;
if(now==root){
cnt=0,dfs(root);
root=build(1,cnt,0);
return;
}
int y=tmp[--deep];
cnt=0,dfs(now);
int k=build(1,cnt,deep&1);
if(t[y].l==now)t[y].l=k;else t[y].r=k;
}
void ask(int x){
if(!x||t[x].Max[0]<X1||t[x].Min[0]>X2||t[x].Max[1]<Y1||t[x].Min[1]>Y2||ans>=k)return;
if(t[x].Min[0]>=X1&&t[x].Max[0]<=X2&&t[x].Min[1]>=Y1&&t[x].Max[1]<=Y2){ans+=t[x].size;return;}
if(t[x].d[0]>=X1&&t[x].d[0]<=X2&&t[x].d[1]>=Y1&&t[x].d[1]<=Y2)ans++;
ask(t[x].l);ask(t[x].r);
}
inline void add(){
int x=1,a=1,b=1000000000,mid,flag=1;
while(1){
if(flag){
cur++;
t[cur].Max[0]=t[cur].Min[0]=t[cur].d[0]=X1;
t[cur].Max[1]=t[cur].Min[1]=t[cur].d[1]=Y1;
t[cur].size=1;
ins(T[x],cur);
}
if(a==b)return;
mid=(a+b)>>1;
if(k<=mid){
if(!l[x])l[x]=++tot;
x=l[x],b=mid,flag=0;
}else{
if(!r[x])r[x]=++tot;
x=r[x],a=mid+1,flag=1;
}
}
}
inline void query(){
ans=0,ask(T[1]);
if(ans<k){
puts("NAIVE!ORZzyz.");
ans=0;
return;
}
int x=1,a=1,b=1000000000,mid;
while(a<b){
mid=(a+b)>>1;
ans=0,ask(T[r[x]]);
if(ans>=k)x=r[x],a=mid+1;else k-=ans,x=l[x],b=mid;
}
printf("%d\n",ans=a);
}
int main(){
read(n),read(n);
while(n--){
read(op),read(X1),read(Y1);X1^=ans,Y1^=ans;
if(op==1){
read(k);k^=ans;
add();
}else{
read(X2),read(Y2),read(k);X2^=ans;Y2^=ans;k^=ans;
query();
}
}
return 0;
}
BZOJ4605 : 崂山白花蛇草水的更多相关文章
- bzoj4605: 崂山白花蛇草水 权值线段树套KDtree
bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...
- 【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree
[BZOJ4605]崂山白花蛇草水 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了 ...
- BZOJ4605:崂山白花蛇草水
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree
题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob ...
- bzoj 4605: 崂山白花蛇草水
Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履行诺言的时 ...
- LG4848 崂山白花蛇草水
题意 神犇 Aleph 在 SDOI Round2 前立了一个 flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 Aleph 的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了. ...
- 崂山白花蛇草水 权值线段树套KDtree
Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履行诺言的时 ...
- 洛谷P4848 崂山白花蛇草水 权值线段树+KDtree
题目描述 神犇 \(Aleph\) 在 \(SDOI\ Round2\) 前立了一个 \(flag\):如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 \(Aleph\) 的实力,他轻松地进了山 ...
- BZOJ 4605 崂山白花蛇草水(权值线段树+KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题目大意] 操作 1 x y k 表示在点(x,y)上放置k个物品, 操作 2 ...
随机推荐
- NYOJ题目1051simone牌文本编辑器
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAKFCAIAAABeD4iTAAAgAElEQVR4nO3dO3LjOtOA4X8TzrUQx1
- Android Tab -- 使用ViewPager、PagerAdapter来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换,自动切换. 代码:https://github.com/ldb ...
- 大话数据结构–1.基础知识+2.算法
2.算法: 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每个指令表现为一个或多个操作. 特性:输入.输出.有穷性.确定性.可行性. 2.9.1.算法时间复杂度: 语句 ...
- Delphi中record和packed record的区别
转载:http://blog.csdn.net/rznice/article/details/6566978 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐. 而第二种带packe ...
- tkprof工具详解二(一些实例)
TKPROF是一个可执行文件,自带在Oracle Server软件中,无需额外的安装. 该工具文件可以用来解析ORACLE的SQL TRACE(10046) 以便生成更可读的内容. 实际上tkpro ...
- 初识SQL Server Integration Service
SSIS(SQL Server Integration Service)是Microsoft 从SQL Server2005 以后发布的,现在一直跟随每个SQL server版本.它是Microsof ...
- <转>删除文件夹下所有的.svn文件
当使用了svn版本控制系统后每个目录下都会有一个.svn目录存在,开发完当交付产品或者上传到服务器时一般要把这些目录删除,这里总结了一下在linux和win下的办法. 一.在linux下 删除这些目录 ...
- 使用html5的离线缓存技术
突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...
- loj 1257 (求树上每一个点到树上另一个点的最长距离)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1257 思路:首先需要用到一个知识点就是树上任一点到树上最长直径的某一个端点的距离最远, ...
- JAVA Day7
6 方法 1.格式[访问控制符] void返回值类型 方法名(参数列表:数据类型 参数名); 2.类的方法: *用来定义类的某种行为或功能 * 3.方法的返回值 *如果有返回值,方法中必须要使用 ...