【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree
【BZOJ4605】崂山白花蛇草水
Description
Input
Output
Sample Input
1 1 1 1
1 2 2 3
1 4 1 2
1 3 4 4
2 1 1 4 1 3
2 2 2 3 5 4
2 2 1 4 4 2
Sample Output
NAIVE!ORZzyz.
3
题解:本题的做法好像挺多,kd-tree套平衡树(TLE),替罪羊套kd-tree(两次重构吓人,但是快的飞起)。然而我选择的是较易实现的权值线段树+kd-tree。
用权值线段树维护排名,然后对于每个节点都开一个kd-tree,统计既在当前排名,又在区间中的数有多少。然而数据比较坑,逼着你写重构,所以需要在每个节点对应的kd-tree失去平衡性后单独对当前的kd-tree重构。这里我用了链表记录每个点的kd-tree中的所有节点的编号,具体实现不详细解释。
然而自从加了重构,构造的数据可以过了,但是随机大数据卡的飞起,于是采用了某种猥琐的手段,求不hack~
对了,在此声明一下,有时我做完题后不知道就把源代码扔哪了,写题解的时候随手粘个东西就发上来了,所以下面放的代码有可能无法AC,如果发现这种情况欢迎指出,谢谢~
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1000000000;
const int maxn=2500010;
int n,m,L[2],R[2],D,cntl,scnt,tcnt,ecnt,ans,sroot;
struct kd
{int v[2],sm[2],sn[2],siz,ls,rs;kd (){}kd (int a,int b){v[0]=sm[0]=sn[0]=a,v[1]=sm[1]=sn[1]=b,siz=1,ls=rs=0;}
};
kd t[maxn],p[100010];
int to[maxn],next[maxn],pos[100010];
struct sag
{int rt,siz,head,ls,rs;void add(int x) { to[++ecnt]=x,next[ecnt]=head,head=ecnt;}
}s[maxn];
int rd()
{int ret=0; char gc=getchar();while(gc<'0'||gc>'9') gc=getchar();while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();return ret;
}
bool cmp(kd a,kd b)
{return (a.v[D]==b.v[D])?(a.v[D^1]<b.v[D^1]):(a.v[D]<b.v[D]);
}
void pushup(int x,int y)
{kd *tx=t+x,*ty=t+y;tx->sm[0]=max(tx->sm[0],ty->sm[0]),tx->sn[0]=min(tx->sn[0],ty->sn[0]);tx->sm[1]=max(tx->sm[1],ty->sm[1]),tx->sn[1]=min(tx->sn[1],ty->sn[1]);tx->siz+=ty->siz;
}
int build(int l,int r,int d)
{if(l>r) return 0;D=d;int mid=l+r>>1,x=pos[mid];nth_element(p+l,p+mid,p+r+1,cmp);kd *tx=t+x;t[x]=p[mid],tx->ls=build(l,mid-1,d),tx->rs=build(mid+1,r,d^1);if(tx->ls) pushup(x,tx->ls);if(tx->rs) pushup(x,tx->rs);return x;
}
void insert(int x,int y)
{D=0;while(x!=y){pushup(x,y);if(cmp(t[x],t[y])){if(!t[x].rs) t[x].rs=y;x=t[x].rs;}else{if(!t[x].ls) t[x].ls=y;x=t[x].ls;}D^=1;}
}
void count(int x)
{kd *tx=t+x;if(!x||tx->sm[0]<L[0]||tx->sn[0]>R[0]||tx->sm[1]<L[1]||tx->sn[1]>R[1]) return ;if(tx->sn[0]>=L[0]&&tx->sm[0]<=R[0]&&tx->sn[1]>=L[1]&&tx->sm[1]<=R[1]){cntl+=tx->siz;return ;}if(tx->v[0]>=L[0]&&tx->v[0]<=R[0]&&tx->v[1]>=L[1]&&tx->v[1]<=R[1]) cntl++;count(tx->ls),count(tx->rs);
}
void updata(int l,int r,int &x,int c,int a,int b)
{if(!x) x=++scnt;sag *sx=s+x;sx->siz++,t[++tcnt]=kd(a,b),sx->add(tcnt);if(m==50000&&sx->siz==2000){sx->siz=0,pos[0]=0;for(int i=sx->head;i;i=next[i]) pos[++pos[0]]=to[i],p[pos[0]]=kd(t[to[i]].v[0],t[to[i]].v[1]);sx->rt=build(1,pos[0],0);}else{if(!sx->rt) sx->rt=tcnt;else insert(sx->rt,tcnt);}if(l==r) return ;int mid=l+r>>1;if(c<=mid) updata(l,mid,sx->ls,c,a,b);else updata(mid+1,r,sx->rs,c,a,b);
}
int query(int l,int r,int x,int a)
{if(!x) return 0;if(l==r) return l;sag *sx=s+x;int mid=l+r>>1;cntl=0,count(s[sx->rs].rt);if(cntl>=a) return query(mid+1,r,sx->rs,a);return query(l,mid,sx->ls,a-cntl);
}
int main()
{n=rd(),m=rd();int i,a,b,c;for(i=1;i<=m;i++){if(rd()==1){a=rd()^ans,b=rd()^ans,c=rd()^ans;updata(1,N,sroot,c,a,b);}else{L[0]=rd()^ans,L[1]=rd()^ans,R[0]=rd()^ans,R[1]=rd()^ans,a=rd()^ans,cntl=0;count(s[1].rt);if(cntl<a) printf("NAIVE!ORZzyz.\n"),ans=0;else ans=query(1,N,sroot,a),printf("%d\n",ans);}}return 0;
}
转载于:https://www.cnblogs.com/CQzhangyu/p/7134115.html
【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree相关推荐
- bzoj4605: 崂山白花蛇草水 权值线段树套KDtree
bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...
- bzoj4605 崂山白花蛇草水 权值线段树套kd树
Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...
- BZOJ 4605 崂山白花蛇草水 权值线段树+K-D树
Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履行诺言的时 ...
- 崂山白花蛇草水 权值线段树套KDtree
崂山白花蛇草水 权值线段树套KDtree Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻 ...
- 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree
题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob ...
- BZOJ 4605 崂山白花蛇草水(权值线段树+KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题目大意] 操作 1 x y k 表示在点(x,y)上放置k个物品, 操作 2 ...
- BZOJ 4605: 崂山白花蛇草水 树套树 权值线段树套kdtree
4605: 崂山白花蛇草水 Time Limit: 80 Sec Memory Limit: 512 MB Submit: 527 Solved: 153 [Submit][Status][Dis ...
- 【线段树套KD树】[BZOJ4605]崂山白花蛇草水
题目描述 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履 ...
- bzoj4605 崂山白花蛇草水(动态开点线段树逃替罪羊重构K-D tree)
首先我们发现它是一个三维的问题而且还强制在线 囧 我们可以考虑在外面来一个权值线段树,然后每次查询时在线段树二分即可,这样我们每个节点再套一棵K-D tree,用来查询有多少个点被框住了,然后因为是不 ...
最新文章
- SharePoint SiteCollection 和SubWeb之间的迁移
- Unity 3D 2019.3.12版本创建一个按钮,并为该按钮添加点击Click的消息响应函数以及点击按钮切换场景
- 处女座男生颜值测试软件,颜值在线又绅士的星座男(图)
- JavaScript中的数组创建
- 诗与远方:无题(四十二)
- telnet黑屏就是通_黑屏的智能农贸市场竟通过验收?市场监管部门:工作力度不够 | 电视问政...
- 某音爆火,人物头像动漫化,为女朋友打造独一无二的头像【python实战:人物图片动漫化】
- 乍暖还寒也不怕 浅谈物联网智能温度控制器
- 朴灵:云计算的开发者视界中,OpenAPI 是绝对主角 | 凌云时刻
- 公司小规模纳税人税务零申报操作说明
- python itchat文档_python itchat简介
- 百度涉嫌行政违法;库克承诺调查“沙特用App监控女性出境”事件;苹果高管涉内幕交易遭起诉 | 雷锋早报...
- MagicalCoder可视化开发平台:轻松搭建业务系统,为企业创造更多价值
- python 听歌识曲_Shazam听歌识曲算法解析+python实现-3 检索歌曲
- JZ4 重建二叉树--java实现
- cad lisp 二次抛物线_cad画二次抛物线
- MYSQL登录遇到的问题:解决ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘(10061)
- html打开网页过场动画_网页制作设计基础知识
- 【APICloud系列|29】dialogBox模块(对话框)的实现
- 梯度爆炸gradient explode和梯度消失gradient vanish