bzoj4605: 崂山白花蛇草水

链接

bzoj

loj

思路

强制在线,那就权值线段树套KDtree好了,没啥好讲的。

KDtree要加平衡因子来重构。另外,那水真难喝。

错误

树套树一边写过了,然后是各种傻屌错误。

我居然离散化了权值,要被gzy嘲笑了。

我一开始还笑话那些写动态开点的慢,

然后就被啪啪脸了。

我回收内存不知道咋的多了个if。

然后就逼近内存上限半个G。

总之就是很多傻吊错误。

代码

#include <bits/stdc++.h>
#define cmin(a,b) (a>b?a=b:a)
#define cmax(a,b) (a>b?a:a=b)
using namespace std;
const int N=1e5+7;
const double alpha=0.8;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int Wn;
struct point {int x[2];} p[N];
bool cmp(point a,point b) {
return a.x[Wn]<b.x[Wn];
}
struct kdnode {
int ch[2],ma[2],mi[2],siz;
point a;
}t[N*30];
int stak[N*30],top,num;
int newnode() {
if(top) return stak[top--];
return ++num;
}
void update(int x,int y) {
cmin(t[x].mi[0],t[y].mi[0]);
cmin(t[x].mi[1],t[y].mi[1]);
cmax(t[x].ma[0],t[y].ma[0]);
cmax(t[x].ma[1],t[y].ma[1]);
}
void up(int u) {
t[u].siz=t[t[u].ch[0]].siz+t[t[u].ch[1]].siz+1;
t[u].mi[0]=t[u].ma[0]=t[u].a.x[0];
t[u].mi[1]=t[u].ma[1]=t[u].a.x[1];
if(t[u].ch[0]) update(u,t[u].ch[0]);
if(t[u].ch[1]) update(u,t[u].ch[1]);
}
int build(int l,int r,int wn) {
if(l>r) return 0;
int mid=(l+r)>>1;
Wn=wn;
nth_element(p+l,p+mid,p+r+1,cmp);
int u=newnode();
t[u].a=p[mid];
t[u].ch[0]=build(l,mid-1,wn^1);
t[u].ch[1]=build(mid+1,r,wn^1);
up(u);
return u;
}
void pia(int u,int num) {
if(t[u].ch[0]) pia(t[u].ch[0],num);
p[num+t[t[u].ch[0]].siz+1]=t[u].a;
stak[++top]=u;
if(t[u].ch[1]) pia(t[u].ch[1],num+t[t[u].ch[0]].siz+1);
}
void check(int &x,int wn) {
if(t[x].siz*alpha<t[t[x].ch[0]].siz||t[x].siz*alpha<t[t[x].ch[1]].siz)
pia(x,0),x=build(1,t[x].siz,wn);
}
void insert(point a,int &u,int wn) {
if(!u) {
u=newnode();
t[u].a=a;
t[u].ch[0]=t[u].ch[1]=0;
up(u);
return;
}
if(a.x[wn]<t[u].a.x[wn]) insert(a,t[u].ch[0],wn^1);
else insert(a,t[u].ch[1],wn^1);
up(u),check(u,wn);
}
int pd(point a,point b,int k) {
if(a.x[0]<=t[k].mi[0]&&t[k].ma[0]<=b.x[0]&&
a.x[1]<=t[k].mi[1]&&t[k].ma[1]<=b.x[1]) return 2;
if(a.x[0]>t[k].ma[0]||b.x[0]<t[k].mi[0]) return 0;
if(a.x[1]>t[k].ma[1]||b.x[1]<t[k].mi[1]) return 0;
return 1;
}
int query(point a,point b,int u) {
if(!u||!pd(a,b,u)) return 0;
if(pd(a,b,u)==2) return t[u].siz;
int ans=0;
if(a.x[0]<=t[u].a.x[0]&&t[u].a.x[0]<=b.x[0]&&a.x[1]<=t[u].a.x[1]&&t[u].a.x[1]<=b.x[1]) ans++;
ans+=query(a,b,t[u].ch[0]);
ans+=query(a,b,t[u].ch[1]);
return ans;
}
namespace seg {
struct dsr_sb {
int ch[2],rt;
}t[N*30];
int tot;
void insert(int l,int r,int &u,point a,int val) {
if(!u) u=++tot;
insert(a,t[u].rt,0);
if(l==r) return;
int mid=(l+r)>>1;
if(val<=mid) insert(l,mid,t[u].ch[0],a,val);
else insert(mid+1,r,t[u].ch[1],a,val);
}
int ask(int l,int r,int u,point a,point b,int k) {
if(l==r) return l;
int mid=(l+r)>>1,tmp=query(a,b,t[t[u].ch[1]].rt);
if(k>tmp) return ask(l,mid,t[u].ch[0],a,b,k-tmp);
else return ask(mid+1,r,t[u].ch[1],a,b,k);
}
}
int main() {
int n=read(),q=read(),lastans=0,rt=0;
n+=n;
for(int i=1;i<=q;++i) {
int opt=read(),k;
point a,b;
a.x[0]=read()^lastans,a.x[1]=read()^lastans;
if(opt==1) {
k=read()^lastans;
seg::insert(1,1e9,rt,a,k);
} else {
b.x[0]=read()^lastans,b.x[1]=read()^lastans;
k=read()^lastans;
int tmp=query(a,b,seg::t[rt].rt);
if(k>tmp) {
puts("NAIVE!ORZzyz.");
lastans=0;
} else {
lastans=seg::ask(1,1e9,rt,a,b,k);
printf("%d\n",lastans);
}
}
}
return 0;
}

bzoj4605: 崂山白花蛇草水 权值线段树套KDtree的更多相关文章

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

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

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

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

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

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

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

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

  5. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  6. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

  7. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  8. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. 当Windows操作系统关机时,不会执行Windows Service的OnStop方法(转载)

    Windows Service OnStop when computer shutdown 问: I'm writing a Windows Service in C#. I want to take ...

  2. Kafka Internals: Consumers

    Check out my last article, Kafka Internals: Topics and Partitions to learn about Kafka storage inter ...

  3. vuejs应用开发前后端分离

    我们知道,无论是web应用还是app应用都有一个前后端,前端主要负责界面交互,后端负责数据持久化.在正规公司中一般是由两个团队来分别完成前端和后端的开发,在小公司或者个人开发的项目中,前后端很有可能是 ...

  4. Java自学-操作符 逻辑操作符

    Java的逻辑运算符 逻辑运算符 示例 1 : 长路与 和 短路与 无论长路与还是短路与 两边的运算单元都是布尔值 都为真时,才为真 任意为假,就为假 区别: 长路与 两侧,都会被运算 短路与 只要第 ...

  5. vue.js 如何加载本地json文件

    在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地 ...

  6. Java 数组(二)基本操作

    一.数组的基本操作 1.数组遍历[重点] 数组遍历:就是将数组中的每个元素分别获取出来,就是遍历.遍历也是数组操作中的基石.  方式一:使用索引下标方式 int[] array = { 15, 25, ...

  7. Qt 使用QLabel、QMovie加载gif图片实现动态等待窗口

    新建基于Widget的应用程序,在ui的窗口中添加QLabel,对象名label,调整整个窗口大小. 准备loading.gif图片  Widget.cpp  12345678910111213141 ...

  8. python 使用Anaconda管理项目环境

    Pycharm没有内置的python解释器,需要我们自己下载python解释器. 在很多python项目中,会导入第三方的模块,逐个去下载导入很不方便. 我们通常使用Anaconda来管理python ...

  9. django memcached/redis缓存 =====缓存session

    全站使用 例如 博客等缓存,通过中间件实现全站缓存. 加缓存中间件,那么多中间件加在什么位置? 请求时:缓存加在中间件里的最后一个,比如一次经过1.2.3.4中间件,加在4 返回事:缓存加在中间件里的 ...

  10. .Net core 在类库中获取配置文件Appsettings中的值

    大多数情况,我们开发的程序中都含有很多个类库和文件夹,有时候,我们会遇到程序中的类库需要获取配置文件的信息的情况. 像dapper 中需要使用连接字符串的时候,那么我们一直从主程序中传值这是个不好的方 ...