崂山白花蛇草水 权值线段树套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大的数 ...
随机推荐
- Spring MVC-控制器(Controller)-参数方法名称解析器(Parameter Method Name Resolver )示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_parametermethodnameresolver.htm 说明:示例基于Sp ...
- Clojure:读取xml
在Clojure中读取XML是很容易的.比如我们有一个名叫strings.xml文件: <?xml version="1.0" encoding="utf-8&qu ...
- [LeetCode]Valid Sudoku解题记录
这道题考查对二维数组的处理,哈希表. 1.最自然的方法就是分别看每一个数是否符合三个规则.所以就须要对应的数据结构来 记录这些信息,判定是否存在.显然最先想到用哈希表. 2.学会把问题抽象成一个个的子 ...
- 个人常常使用的一些Eclipse技巧
引言 为了加快开发效率,方便地浏览源代码,重构以及重写一些方法等,Eclipse给我们提供了非常多方便的快捷键以及小技巧.以下是我总结一下经常使用的快捷键和技巧. 快捷键 清理控制台(console) ...
- 把握linux内核设计思想系列
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 本专栏分析linux内核的设计实现,包含系统调用.中断.下半部机制.时间管理. ...
- (转)linux口令相关文件(/etc/passwd和/etc/shadow)
在linux中,口令文件在/etc/passwd中,早期的这个文件直接存放加密后的password,前两位是"盐"值,是一个随机数.后面跟的是加密的password.为了安全,如今 ...
- 浅谈 System.Decimal 结构
引言 我们知道,Microsoft .NET Framework 中的 System.Decimal 结构(在 C# 语言中等价于 decimal keyword)用来表示十进制数,范围从 -(296 ...
- C++操作Json字符串
一.从字符串中读取JSON a.cpp ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- hdoj--3790--最短路径问题(双权值迪杰斯特拉)
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- PCB 后台自动系统集成与邮件推送实现
在PCB行业中,工程系统是主要数据生产者,而这些数据不仅仅给自己系统使用呀,我们需要将数据传递到各系统,才达到各系统共同协作的目的. 这里以问答方式对实现方式进行讲解.呵呵呵! 后台自动集成问题解答: ...