最近很对劲的太刀流做的一道题中说树是无向连通无环图,并不对劲的片手流为了反驳他,决定与之针锋相对,就练线段无向连通无环图套平衡无向连通无环图的题。

很对劲的太刀流->

题意非常简单,就是维护一个数据结构,支持区间排名、区间第k大、单点修改、区间前驱后继这些操作。

主席树+树状数组想必是可以做的,但是并不对劲的人并不想开权值线段树,于是就选择了这种常数极大的做法。

需要注意的是,并不能直接找到区间内排在第k位的数。要二分出答案,然后判断解的排名是否对劲。答案是符合条件的的最大值(因为有的对劲的数并没有出现在数列里)。

并不觉得有什么好说的。

可以去洛谷的模板题提交-> 

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 5000010
#define ls son[u][0]
#define rs son[u][1]
#define rks son[rk][0]
#define m (l+r>>1)
#define s0 siz[0]=0
#define Ls (n<<1)
#define Rs (n<<1|1)
#define inf 2147483647
#define rep(i,x,y) for(register int i=(x);i<=(y);i++)
#define dwn(i,x,y) for(register int i=(x);i>=(y);i--)
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(isdigit(ch)==0 && ch!='-')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}
inline void write(int x)
{int f=0;char ch[20];if(!x){putchar('0'),putchar('\n');return;}if(x<0){putchar('-');x=-x;}while(x)ch[++f]=x%10+'0',x/=10;while(f)putchar(ch[f--]);putchar('\n');
}
int rt[maxn],fa[maxn],son[maxn][3],key[maxn],num[maxn],siz[maxn],a[maxn],cnt,nn,x,y,rank;
inline void pu(int u){s0,siz[u]=siz[ls]+siz[rs]+num[u],s0;}
inline int res(int k,int f){key[++cnt]=k,fa[cnt]=f,num[cnt]=1;return cnt;}
inline int getso(int u){return son[fa[u]][0]!=u;}
inline void rot(int u)
{int fu=fa[u],ffu=fa[fu],l=getso(u),r=l^1,fl=getso(fu),rson=son[u][r];fa[rson]=fu,fa[u]=ffu,fa[fu]=u,son[u][r]=fu,son[fu][l]=rson,son[ffu][fl]=u;pu(fu),pu(u);
}
inline void splay(int u,int k,int pla)
{while(fa[u]!=k){int fu=fa[u];if(fa[fu]!=k)rot(getso(u)^getso(fu)?u:fu);rot(u);}if(!k)rt[pla]=u;
}
inline void fnd(int k,int pla)
{int u=rt[pla];while(son[u][k>key[u]]&&k!=key[u])u=son[u][k>key[u]];splay(u,0,pla);
}
inline int nxt(int k,int f,int pla)
{fnd(k,pla);int u=rt[pla];if((key[u]>k&&f)||(key[u]<k&&!f))return u;u=son[u][f];while(son[u][f^1])u=son[u][f^1];return u;
}
inline void ins(int k,int pla)
{int lk=nxt(k,0,pla),rk=nxt(k,1,pla);splay(lk,0,pla),splay(rk,lk,pla);if(rks)num[rks]++;else rks=res(k,rk);pu(rks),pu(rk),pu(lk);
}
inline void sgtr(int n,int l,int r)
{rt[n]=res(-inf,0);son[rt[n]][1]=res(inf,rt[n]);pu(son[rt[n]][1]),pu(rt[n]);rep(i,l,r)ins(a[i],n);if(l==r)return;sgtr(Ls,l,m),sgtr(Rs,m+1,r);
}
inline int rnk(int k,int pla)
{int u=rt[pla],rank=0;while(u){if(key[u]==k){rank+=siz[ls];break;}if(key[u]<k)rank+=siz[ls]+num[u],u=rs;else u=ls;}return rank-1;
}
inline void del(int k,int pla)
{int lk=nxt(k,0,pla),rk=nxt(k,1,pla);splay(lk,0,pla),splay(rk,lk,pla);if(num[rks]>1)num[rks]--;else rks=0;pu(rks),pu(rk),pu(lk);
}
inline int _1(int n,int l,int r,int k)
{//getrankif(x<=l&&r<=y)return rnk(k,n);if(y<l||r<x)return 0;int lans=_1(Ls,l,m,k),rans=_1(Rs,m+1,r,k);return lans+rans;
}
inline int _2(int k)
{//kthint l=0,r=100000001;while(l!=r){rank=_1(1,1,nn,m)+1;if(rank>k) r=m;else l=m+1;}return l-1;
}
inline void _3(int n,int l,int r,int k)
{//changeif(x<l||r<x)return;del(a[x],n),ins(k,n);if(l==r)return;_3(Ls,l,m,k),_3(Rs,m+1,r,k);if(n==1)a[x]=k;
}
inline int _4(int n,int l,int r,int k)
{//prefixif(x<=l&&r<=y)return key[nxt(k,0,n)];if(y<l||r<x)return -inf;int lans=_4(Ls,l,m,k),rans=_4(Rs,m+1,r,k);return max(lans,rans);
}
inline int _5(int n,int l,int r,int k)
{//suffixif(x<=l&&r<=y)return key[nxt(k,1,n)];if(y<l||r<x)return inf;int lans=_5(Ls,l,m,k),rans=_5(Rs,m+1,r,k);return min(lans,rans);
}
int main()
{int n,q,f,c;nn=n=read(),q=read();rep(i,1,n)a[i]=read();sgtr(1,1,n);while(q--){f=read(),x=read(),y=read(),c;if(f==1)c=read(),write(_1(1,1,n,c)+1);if(f==2)c=read(),write(_2(c));if(f==3)_3(1,1,n,y);if(f==4)c=read(),write(_4(1,1,n,c));if(f==5)c=read(),write(_5(1,1,n,c));}return 0;
}

并不对劲

不写splay这种常数极大的平衡无向连通无环图就不用开O2了。

据说拼命卡常能过。

转载于:https://www.cnblogs.com/xzyf/p/8597700.html

并不对劲的线段树套平衡树相关推荐

  1. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

  2. 树套树-线段树套平衡树

    作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...

  3. 二逼平横树——线段树套平衡树

    注意空间大小,以及建树时的细节 #include<cstdio> #include<algorithm> #include<iostream> using name ...

  4. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  5. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

  6. 模板:二维线段树(线段树套线段树)

    文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...

  7. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】

    1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...

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

    Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...

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

    崂山白花蛇草水 权值线段树套KDtree Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻 ...

最新文章

  1. P1171 售货员的难题--搜索(剪枝)
  2. 贴吧小爬虫之爬取源码
  3. Java 8:将匿名类转换为Lambda表达式
  4. java truevfs_Java-Apache Commons VFS:使用FTP
  5. 【codevs1368】【BZOJ1034】泡泡堂BNB,贪心思路
  6. 解决Error: ENOENT: no such file or directory, scandir ‘xxx\node-sass\vendor‘
  7. 进阶03 System、StringBuilder类
  8. Xmind 8思维导图使用方法
  9. 2016年中国的SaaS服务商企业研究
  10. 【时间之外】Chrome浏览器缓存解析
  11. 基于边界凹凸点和神经网络的粘连颗粒图像分割算法研究(既然有网友要源代码研究,在此公开绝大部分源代码)
  12. MySQL数素数_素数个数-欧拉筛法
  13. 支付宝扫码跳转到跳转页面
  14. matlab绘制垂线(x轴或y轴)
  15. 计算机网络设备的种类,计算机网络设备选型依据.ppt
  16. Python+OpenCV实现图像处理OCR手写数字识别原理
  17. 解决sudo update-initramfs -u 时报错
  18. Invalid header signature; read 0x3C0A0D0A0DBFBBEF, expected 0xE11AB1A1E011CFD0
  19. TM1637驱动数码管
  20. Linux 系统管理员

热门文章

  1. Django- 6 -学校后台管理系统-老师管理(模态对话框元素移动)
  2. webpack打包文件过大,如何解决
  3. 通过AppStore上的app生成二维码扫描下载
  4. 通过前序中序,中序后序,前序后序来构造一二叉树
  5. MFC---CStdioFile
  6. 小程序公众号配置使用说明
  7. 苹果电脑pdf文件太大如何变小,mac苹果电脑如何压缩pdf?
  8. 如何把数百个列数不定但格式相同的 Excel 汇总合计
  9. 清除/更换word文档里段落最后的向下的小箭头(软回车符号/键)
  10. QTableView多行选中