崂山白花蛇草水 权值线段树套KDtree
Description
Input
Output
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;
}
崂山白花蛇草水 权值线段树套KDtree的更多相关文章
- 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree
题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob ...
- bzoj4605: 崂山白花蛇草水 权值线段树套KDtree
bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...
- 【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree
[BZOJ4605]崂山白花蛇草水 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了 ...
- 洛谷P4848 崂山白花蛇草水 权值线段树+KDtree
题目描述 神犇 \(Aleph\) 在 \(SDOI\ Round2\) 前立了一个 \(flag\):如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 \(Aleph\) 的实力,他轻松地进了山 ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- assign retain 和copy的区别
assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等 等. 此标记说明设置器直接进⾏行赋值,这也是默认值.在使⽤用垃圾 ...
- Adobe photoshop CC 2018安装激活教程
2017年10月,Adobe公司发布最新版Adobe CC 2018系列软件,photoshop cc 2018更是迎来惊艳的新功能.下面来分享安装和激活教程. 不会安装请加QQ:1833920353 ...
- jsp param动作标签
param 标签以"名字-值"对的形式为其它标签提供附加消息.这个标签与jsp:include.jsp:forward.jsp:plugin标签一起使用. param 动作标签 & ...
- 阿里2016实习offer五面经验与总结
前言 眼下楼主已经拿到阿里实习offer,一共经历了5次面试,当中4轮技术面.1轮HR面试.在这里分享一下自己的面试经验和学习总结.写这篇面经主要是希望可以帮助很多其它的小伙伴.我本科毕业于中南大学信 ...
- [ACM] POJ 1942 Paths on a Grid (组合)
Paths on a Grid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21297 Accepted: 5212 ...
- Delphi 中控件路径加入不进去解决方法
使用notepa++打开project中的*.dproj文件,在里面找到相似例如以下的区域 <DCC_UnitSearchPath>T:\BusinessSkinForm1006Sourc ...
- @ConfigurationProperties注解
@Value获取值和@ConfigurationProperties获取值比较 | | @ConfigurationProperties | @Value | | ------- ...
- 1366 xth 的第 12 枚硬币
1366 xth 的第 12 枚硬币 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 传说 xth 曾 ...
- 【转】iPhone获取状态栏和导航栏尺寸(宽度和高度)
原文网址:http://blog.csdn.net/chadeltu/article/details/42708605 iPhone开发当中,有时需要获取状态栏和导航栏高度.宽度信息,方便布局其他控件 ...
- 0604-面向对象、类与对象、类、static、构造方法/析构方法
一.面向对象 1.面向过程:一个人分步骤完成某个事情 2.面向对象:某件事情拆分为多个任务,由每个对象独立完成,最后调用整合为一个完整的项目 3.三要素:继承.封装.多态. 封装:私有化属性 提供公共 ...