[BZOJ4605] 崂山白花蛇草水 题解

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


动态全局 \(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860867.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PYTHON语言学习笔记(基础语法篇)

Python学习笔记 序言 主要是以小甲鱼的视频为主,https://space.bilibili.com/314076440 一些特性 多次调用方法是从左到右.而参数是函数则先执行参数. 一行如果要多个赋值,用;隔开 input().split() IO 看我放在另一个地方的文档.<D:\Document\md\PYTHON\IO.md> 数据类型 …

2024-11-28《关于mybatis创建的mapper映射路径不对导致的系列报错》

关于mybatis创建的mapper映射路径不对导致的系列报错今天在写mybatis项目的时候,使用注解发现无法使用别名,添加ResultMap的时候直接报错显示无法解析。 经过百度了好久也是成功的发现了问题的所在,就是这个:这个路径创建的时候我以为创建的是分级目录,实际上创建成为了co…

2024-11-29《axios获取不到response返回的响应的解决方法》

axios获取不到response返回的响应的解决方法今天在用mybatis+vue+axios写登录界面的时候,发现用户名还有密码的数据都能够传输到servlet里,但是当servlet对html界面进行相应的时候,axios却收不到消息,经过长时间的排查后也没有发现问题,终于在今晚的百度下发现了结果,上原…

如何解决宝塔面板无法登录的问题?

您好,当您遇到宝塔面板无法登录的问题时,可以按照以下步骤进行排查和解决:确认初始密码:如果您从未修改过宝塔面板的登录密码,默认情况下,宝塔面板的初始密码与服务器的初始密码相同。您可以尝试使用服务器的初始密码进行登录。如果您不确定服务器的初始密码,可以在云服…

如何解决网站默认80端口无法访问的问题?

您好,当您遇到网站默认80端口无法访问的问题时,可以按照以下步骤进行排查和解决:确认域名解析:首先,检查域名是否正确解析到服务器的IP地址。您可以通过在线DNS查询工具(如(网址))来验证域名解析是否正确。如果解析有问题,请联系域名注册商进行修正。检查服务器状态:登…

请问如何解决宝塔面板无法登录的问题?

您好,当您遇到宝塔面板无法登录的问题时,可以按照以下步骤进行排查和解决,确保能够顺利访问并管理您的服务器:确认初始密码:如果您从未修改过宝塔面板的登录密码,默认情况下,宝塔面板的初始密码与服务器的初始密码相同。您可以尝试使用服务器的初始密码进行登录。如果您…

网站频繁出现500错误 - 云服务器性能问题

关于您提到的网站经常报500错误并且服务器卡死的问题,这是一个比较复杂的情况,涉及到多个方面。为了帮助您彻底解决这个问题,我们需要从以下几个角度进行分析和排查: 一、服务器资源监控 首先,当网站出现500错误时,服务器资源(CPU、内存、磁盘I/O等)是否处于高位占用状…

网站后台打开出错 - 虚拟主机/数据库问题

一、检查PHP版本兼容性 首先,您提到有时登录时会遇到错误提示,而有时又能正常访问。这种情况可能与PHP版本有关。不同的PHP版本对某些函数或库的支持程度不同,如果您的网站程序依赖于特定版本的PHP特性,当切换到不兼容的版本时,可能会导致功能异常。 建议您尝试切换PHP版本…

2024-11-11《VsCode运行时输出日志》

VsCode运行C#时终端输出日志最近在使用vscode运行C#项目的时候,终端总会先输出一些无关的日志信息才会输出运行结果,搜索解决后发现是终端输出了日志信息,首先咱们看一下他输出的信息。这是我的代码: using System; using System.Collections.Generic; using System.Lin…

2024-10-31《c#学习》

今天进行了C#的初步学习,主要了解了C#的相关知识:目录基础语法 数据类型值类型 引用类型 动态(Dynamic)类型 字符串类型 指针类型类型转换 变量 常量 运算符 判断 循环 封装 基础语法首先是在C#里的基础语法,大致与C++还有Java类似,可以说是二者的结合体,基本的Hello Worl…

搬家后无法进入后台怎么办

问题描述: 网站搬家后,无法进入后台管理界面,可能是由于密码问题或配置错误引起的。请帮助恢复。 解决方案: 您好,网站搬家后无法进入后台管理界面确实是一个常见的问题。为了帮助您顺利恢复后台访问,建议您按照以下步骤逐一排查:确认密码正确:首先,确保您使用的后台登…

数据库密码无法更改怎么办

问题描述: 虚拟主机环境下,尝试更改数据库密码时遇到问题,无法成功更改。请帮助解决。 解决方案: 您好,数据库密码无法更改可能是由于权限不足、配置文件错误或数据库连接问题引起的。为了帮助您顺利更改密码,建议您按照以下步骤逐一排查:确认权限:确保您有足够的权限执…