崂山白花蛇草水 权值线段树套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大的数 ...
随机推荐
- MyEclipse10及插件安装教程(附安装包和破解文件)
MyEclipse10安装包+破解文件:MyEclipse10安装包.MyEclipse10破解文件MyEclipse10安装包地址:http://pan.baidu.com/s/1pJrCLB1My ...
- [csdn markdown]使用摘记一源码高亮及图片上传和链接
本文主要内容是体验csdn markdown的代码块高亮显示和图片链接及上传. 图片上传 上边这是标题行.仅仅须要使用一个#就能够表示.几个表示是几级标题 图片上传 本地图片上传控件 本地图片上传方式 ...
- java的征途
前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大 约在 2003 年我开始知道 Java 的(当时还在用 Delp ...
- 数据结构C++,栈的实现
#include <iostream>#include <cstdlib> template<class T>void changeLength1D(T*& ...
- 74.资金管理-员工工资配置 extjs 页面
1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&quo ...
- 第16课 “远程 Git文档库” 的基础操作
16-1 “远程Git文档库” 的功能 如果 “本地Git文档库” 和 “远程Git文档库” 是存储在不同的计算机中,它们之前传送数据可以通过HTTP/HTTPS.SSH.GIT proto ...
- A Reusable Aspect for Memory Profiling
例子: malPro.acc文件: #include <stdlib.h> size_t totalMemoryAllocated; int totalAllocationFuncCall ...
- mybatis中if标签判断字符串相等问题
mybatis 映射文件中,if标签判断字符串sfyx变量是否是字符串Y的时候,发现并不管用: <if test="sfyx=='Y' "> and 1=1 </ ...
- PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明
用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...
- hdu3511-Prison Break
纪念一下人生中第一道扫描线算法的题.....其实不是严格上的第一道...第一次遇到的那个至今没过..... 题目链接: http://acm.hdu.edu.cn/showproblem.php?pi ...