突然想买一瓶,然后喝上几口。(不要命的想法)


动态全局 \(k\) 大想到权值线段树上二分。

由于要存储二维的点,所以得用到我们神通广大的 \(KDT\) 了。

那么想到权值线段树套 \(KDT\) 这种算法了。

笔者用的是二进制分组的写法,插入单次均摊时间复杂度是 \(O(\log^3n)\),查询单次均摊时间复杂度是 \(O(\sqrt n\log n)\)。

时间复杂度 \(O(n+q(\log^3n+\sqrt n\log n))\)。

#include<bits/stdc++.h>
#define ls(x) nd[x].ls
#define rs(x) nd[x].rs
#define sm(x) nd[x].sm
#define id(x,y) nd[x].id[y]
#define lp(x,y) nd[x].lp[y]
#define rd(x,y) nd[x].rd[y]
#define mn(x,y,z) x<y?x<z?x:z:y<z?y:z
#define mx(x,y,z) x>y?x>z?x:z:y>z?y:z
#define mxx(x,y) x>y?x:y
using namespace std;
const int N=3e6+5;
struct node{
int ls,rs,sm,id[2];
int lp[2],rd[2];
}nd[N];int n,q,tot,a[N],la,kw;
int cmp(int x,int y){
return id(x,kw)<id(y,kw);
}struct kd_tree{
int rt[20],tp;
void push_up(int x){
sm(x)=sm(ls(x))+sm(rs(x))+1;
lp(x,0)=mn(id(x,0),lp(ls(x),0),lp(rs(x),0));
lp(x,1)=mn(id(x,1),lp(ls(x),1),lp(rs(x),1));
rd(x,0)=mx(id(x,0),rd(ls(x),0),rd(rs(x),0));
rd(x,1)=mx(id(x,1),rd(ls(x),1),rd(rs(x),1));
}int build(int l,int r,int k){
int mid=(l+r)/2;kw=k;
nth_element(a+l,a+mid,a+r+1,cmp);
if(l<mid) ls(a[mid])=build(l,mid-1,k^1);
if(r>mid) rs(a[mid])=build(mid+1,r,k^1);
return push_up(a[mid]),a[mid];
}void clear(int &x){
a[++tp]=x;
if(ls(x)) clear(ls(x));
if(rs(x)) clear(rs(x));x=0;
}void add(int x){
a[tp=1]=x;int t=0;
while(rt[t]) clear(rt[t]),t++;
rt[t]=build(1,tp,0);
}void insert(int x,int y){
id(++tot,0)=x,id(tot,1)=y,add(tot);
}void que(int x,int xa,int ya,int xb,int yb,int k,int &s){
if(lp(x,0)>=xa) if(rd(x,0)<=xb)
if(lp(x,1)>=ya) if(rd(x,1)<=yb){
s=mxx(0,s-sm(x));return;
}if(lp(x,0)>xb) return;if(rd(x,0)<xa) return;
if(lp(x,1)>yb) return;if(rd(x,1)<ya) return;
if(id(x,0)>=xa) if(id(x,0)<=xb)
if(id(x,1)>=ya) if(id(x,1)<=yb) s--;
if(!s) return;
if(ls(x)) que(ls(x),xa,ya,xb,yb,k^1,s);
if(!s) return;
if(rs(x)) que(rs(x),xa,ya,xb,yb,k^1,s);
}int qu(int xa,int ya,int xb,int yb,int k){
int t=20;
while(t--) if(rt[t]){
que(rt[t],xa,ya,xb,yb,0,k);
if(!k) return 0;
}return k;
}
}tg[N];int cnt,lc[N],rc[N],rt;
void add(int &x,int l,int r,int k,int xc,int yc){
if(!x) x=++cnt;tg[x].insert(xc,yc);
if(l==r) return;int mid=(l+r)/2;
if(k<=mid) add(lc[x],l,mid,k,xc,yc);
else add(rc[x],mid+1,r,k,xc,yc);
}int ans(int x,int l,int r,int xa,int ya,int xb,int yb,int k){
if(l==r) return l;int mid=(l+r)/2;
int cc=tg[rc[x]].qu(xa,ya,xb,yb,k);
if(cc) return ans(lc[x],l,mid,xa,ya,xb,yb,cc);
return ans(rc[x],mid+1,r,xa,ya,xb,yb,k);
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q,lp(0,0)=lp(0,1)=2e9;
while(q--){
int opt,x,y,z,w,k;
cin>>opt>>x>>y>>z;
x^=la,y^=la,z^=la;
if(opt==2){
cin>>w>>k,w^=la,k^=la;
if(tg[rt].qu(x,y,z,w,k)){
cout<<"NAIVE!ORZzyz.\n";
la=0;continue;
}la=ans(rt,1,1e9,x,y,z,w,k);
if(!la) cout<<"NAIVE!ORZzyz.\n";
else cout<<la<<"\n";
}else add(rt,1,1e9,z,x,y);
}return 0;
}

[BZOJ4605] 崂山白花蛇草水 题解的更多相关文章

  1. bzoj4605: 崂山白花蛇草水 权值线段树套KDtree

    bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...

  2. BZOJ4605 : 崂山白花蛇草水

    外层维护权值线段树,内层维护kd-tree. 修改的时候只往右儿子里插入,不平衡的时候替罪羊式重构. 查询的时候在外层线段树上走,在内层kd-tree上查询矩形内点数即可. 时间复杂度$O(q\log ...

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

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

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

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

  5. BZOJ4605:崂山白花蛇草水

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  6. LG4848 崂山白花蛇草水

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

  7. bzoj 4605: 崂山白花蛇草水

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

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

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

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

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

  10. BZOJ 4605 崂山白花蛇草水(权值线段树+KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题目大意] 操作 1 x y k 表示在点(x,y)上放置k个物品, 操作 2 ...

随机推荐

  1. DASCTF X CBCTF 2023 Misc Justlisten WP

    DASCTF X CBCTF 2023 Misc Justlisten WP 又是一道很抽象的misc题 首先附件给了一个汉信码,扫码得到: 提示我们使用oursecret: password为0ur ...

  2. ABS函数:C语言与Excel中的绝对值计算

    ABS函数:C语言与Excel中的绝对值计算 ABS函数在不同的编程和计算环境中有着相似但又有所区别的用途.在本文中,我们将重点探讨ABS函数在C语言中的应用,同时也会结合Excel中的ABS函数进行 ...

  3. 中电金信:GienTech动态|丰收之秋,公司多项目获得荣誉

    ​ 中电金信微电影<妙"笔"生花>获国资委表彰 ​ 近日,国务院国资委在京举行中央企业社会主义核心价值观主题微电影(微视频)展映发布活动.中电金信作品<妙&quo ...

  4. 【Javaweb】【Js】【Servlet】Js与Servlet交互 - Js请求Servlet与响应Servlet

    [原生JS][POST]请求和响应(一) 虽然效率有点低,但是作为初学者,可以先看看这个,然后再去看后面用Json处理. XMLHttpRequest介绍 XMLHttpRequest 对象用于在后台 ...

  5. 安装Spring源码时报错No such property: values for class: org.gradle.api.internal.tasks.DefaultTas

    IDEA进行项目拉取时:No such property: values for class: org.gradle.api.internal.tasks.DefaultTas 修改spring-be ...

  6. 龙哥量化:通达信板块概念FAQ,*期强势、*期弱势是怎么划分的?等问题是官网的解释,股友可以根据文章的提示迸发策略灵感

    如果您需要代写公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 比如第9条,*期强势:20日涨幅>=30%,     3日涨幅>0,非停牌.非ST.非未开板 ...

  7. 跟着源码一起学:手把手教你用WebSocket打造Web端IM聊天

    本文作者芋艿,原题"芋道 Spring Boot WebSocket 入门",本次有修订和改动. 一.引言 WebSocket如今在Web端即时通讯技术应用里使用广泛,不仅用于传统 ...

  8. WPF中实现弹出进度条窗口

    实现功能: 模拟一个任务开始执行,在窗口弹出一个进度条,展示执行进度,执行完成弹出提示框.例如做数据查询时,如果查询需要一段时间,操作人员可以很好的知道是否查询完成. 1. 设计进度条弹出窗口 进度条 ...

  9. milvus操作

    java 引入依赖 <dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-j ...

  10. Solution -「CF 1366E2」Chiori and Doll Picking (hard version)

    \(\mathscr{Description}\)   Link.   给定 \(\{a_n\}\), 值域 \([0,2^m)\). 对于每个 \(i\in[0,m]\), 求有多少个 \(\{a_ ...