热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

树套树——BZOJ3196/Luogu3380二逼平衡树

http://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problem/show?pid&#61

http://www.lydsy.com/JudgeOnline/problem.php?id=3196
https://www.luogu.org/problem/show?pid=3380
tyvj原题:传送门
这么多乱七八糟的操作,交给平衡树好了
再加上区间,外面套个线段树好了
不过呢,可能我写得太渣了吧,splay一直TLE
没办法,换了个非旋式Treap搞搞掉算了。。。

#include
using namespace std;
const int oo=2147483647;
struct tree{int l,r,v,w,s,nod;
}t[2000001];
int a[200001],root[200001];
int sum=0,n,m,ans;
inline void update(int x){t[x].s=t[t[x].l].s+t[t[x].r].s+t[x].w;}
inline void rturn(int &x){int tt=t[x].l;t[x].l=t[tt].r;t[tt].r=x;t[tt].s=t[x].s;update(x);x=tt;
}
inline void lturn(int &x){int tt=t[x].r;t[x].r=t[tt].l;t[tt].l=x;t[tt].s=t[x].s;update(x);x=tt;
}
inline void sinsert(int &x,int y){if(x==0){sum++;x=sum;t[x].s=t[x].w=1;t[x].v=y;t[x].nod=rand();return;}t[x].s++;if(t[x].v==y)t[x].w++;else if(y>t[x].v){sinsert(t[x].r,y);if(t[t[x].r].nodelse{sinsert(t[x].l,y);if(t[t[x].l].nod}
inline void sshan(int &x,int y){if(x==0)return;if(t[x].v==y){if(t[x].w>1){t[x].w--;t[x].s--;return;}if(t[x].l*t[x].r==0)x=t[x].l+t[x].r;else if(t[t[x].l].nodelse lturn(x),sshan(x,y);}else if(y>t[x].v)t[x].s--,sshan(t[x].r,y);else t[x].s--,sshan(t[x].l,y);
}
inline void srank(int x,int y){if(x==0)return;if(t[x].v==y){ans+=t[t[x].l].s;return;}else if(y>t[x].v){ans+=t[t[x].l].s+t[x].w;srank(t[x].r,y);}else srank(t[x].l,y);
}
inline void spre(int x,int y){if(x==0)return;if(t[x].velse spre(t[x].l,y);
}
inline void ssucc(int x,int y){if(x==0)return;if(t[x].v>y){ans=min(ans,t[x].v);ssucc(t[x].l,y);}else ssucc(t[x].r,y);
}
inline void winsert(int l,int r,int x,int v,int nod){sinsert(root[nod],v);if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;if(x<&#61;mid)winsert(l,mid,x,v,nod*2);else winsert(mid&#43;1,r,x,v,nod*2&#43;1);
}
inline void wrank(int l,int r,int x,int y,int k,int nod){if(l&#61;&#61;x&&r&#61;&#61;y){srank(root[nod],k);return;}int mid&#61;(l&#43;r)>>1;if(mid>&#61;y)wrank(l,mid,x,y,k,nod*2);else if(x>mid)wrank(mid&#43;1,r,x,y,k,nod*2&#43;1);else{wrank(l,mid,x,mid,k,nod*2);wrank(mid&#43;1,r,mid&#43;1,y,k,nod*2&#43;1);}
}
inline int wnum(int x,int y,int k){int l&#61;0,r&#61;oo,cnt;while(l<&#61;r){ans&#61;1;int mid&#61;(l&#43;r)>>1;wrank(1,n,x,y,mid,1);if(ans<&#61;k)cnt&#61;mid,l&#61;mid&#43;1;else r&#61;mid-1;}return cnt;
}
inline void whuan(int l,int r,int x,int y,int v,int nod){sshan(root[nod],y);sinsert(root[nod],v);if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;if(x<&#61;mid)whuan(l,mid,x,y,v,nod*2);else whuan(mid&#43;1,r,x,y,v,nod*2&#43;1);
}
inline void wpre(int l,int r,int x,int y,int k,int nod){if(l&#61;&#61;x&&r&#61;&#61;y){spre(root[nod],k);return;}int mid&#61;(l&#43;r)>>1;if(mid>&#61;y)wpre(l,mid,x,y,k,nod*2);else if(x>mid)wpre(mid&#43;1,r,x,y,k,nod*2&#43;1);else{wpre(l,mid,x,mid,k,nod*2);wpre(mid&#43;1,r,mid&#43;1,y,k,nod*2&#43;1);}
}
inline void wsucc(int l,int r,int x,int y,int k,int nod){if(l&#61;&#61;x&&r&#61;&#61;y){ssucc(root[nod],k);return;}int mid&#61;(l&#43;r)>>1;if(mid>&#61;y)wsucc(l,mid,x,y,k,nod*2);else if(x>mid)wsucc(mid&#43;1,r,x,y,k,nod*2&#43;1);else{wsucc(l,mid,x,mid,k,nod*2);wsucc(mid&#43;1,r,mid&#43;1,y,k,nod*2&#43;1);}
}
int main()
{scanf("%d%d",&n,&m);for(int i&#61;1;i<&#61;n;i&#43;&#43;){scanf("%d",&a[i]);winsert(1,n,i,a[i],1);}int x,y,z,k;for(int i&#61;1;i<&#61;m;i&#43;&#43;){scanf("%d%d%d",&z,&x,&y);if(z&#61;&#61;1)scanf("%d",&k),ans&#61;1,wrank(1,n,x,y,k,1),printf("%d\n",ans);else if(z&#61;&#61;2)scanf("%d",&k),printf("%d\n",wnum(x,y,k));else if(z&#61;&#61;3)whuan(1,n,x,a[x],y,1),a[x]&#61;y;else if(z&#61;&#61;4)scanf("%d",&k),ans&#61;-oo,wpre(1,n,x,y,k,1),printf("%d\n",ans);else if(z&#61;&#61;5)scanf("%d",&k),ans&#61;oo,wsucc(1,n,x,y,k,1),printf("%d\n",ans);}return 0;
}

贴一下我的splay代码吧&#xff0c;欢迎大佬帮我找错&#xff0c;谢谢辣>_<&#xff01;

#include
using namespace std;
const int oo&#61;2147483647;
int t[2000001][2],fa[2000001],v[2000001],val[2000001],s[2000001];
int a[200001],root[200001];
int tt&#61;0,n,m,ans;
inline void pushup(int x){s[x]&#61;s[t[x][0]]&#43;s[t[x][1]]&#43;v[x];}
inline void turn(int x,int &p){int y&#61;fa[x],z&#61;fa[y],l,r;if(t[y][0]&#61;&#61;x)l&#61;0;else l&#61;1;r&#61;l^1;if(y&#61;&#61;p)p&#61;x;else if(t[z][0]&#61;&#61;y)t[z][0]&#61;x;else t[z][1]&#61;x;fa[x]&#61;z;fa[y]&#61;x;fa[t[x][r]]&#61;y;t[y][l]&#61;t[x][r];t[x][r]&#61;y;pushup(y);pushup(x);
}
inline void splay(int x,int &p){int y,z;while(x!&#61;p){y&#61;fa[x];z&#61;fa[y];if(y!&#61;p){if((t[y][0]&#61;&#61;x)^(t[z][0]&#61;&#61;y))turn(x,p);else turn(y,p);}turn(x,p);}
}
inline void sinsert(int& rt,int k){if(!rt){tt&#43;&#43;;rt&#61;tt;val[tt]&#61;k;s[tt]&#61;v[tt]&#61;1;return;}int p&#61;rt,z;while(p){z&#61;p;s[p]&#43;&#43;;if(k0];else if(k>val[p])p&#61;t[p][1];else{v[p]&#43;&#43;;pushup(p);splay(p,rt);return;}}if(val[z]>k)t[z][0]&#61;&#43;&#43;tt;else t[z][1]&#61;&#43;&#43;tt;val[tt]&#61;k;s[tt]&#61;v[tt]&#61;1;fa[tt]&#61;z;splay(tt,rt);
}
inline void sshan(int& rt,int y){int x&#61;rt;while(val[x]!&#61;y){if(val[x]>y)x&#61;t[x][0];else x&#61;t[x][1];}splay(x,rt);if(v[x]>1){v[x]--;pushup(x);return;}if(t[x][0]*t[x][1]&#61;&#61;0)rt&#61;t[x][0]&#43;t[x][1];else{int y&#61;t[x][1];while(t[y][0])y&#61;t[y][0];t[y][0]&#61;t[x][0];fa[t[x][0]]&#61;y;s[t[y][0]]&#61;s[t[x][0]];v[t[y][0]]&#61;v[t[x][0]];pushup(y);rt&#61;t[x][1];}fa[rt]&#61;0;
}
inline void srank(int x,int y){if(x&#61;&#61;0)return;if(val[x]&#61;&#61;y){ans&#43;&#61;s[t[x][0]];return;}else if(y>val[x]){ans&#43;&#61;s[t[x][0]]&#43;v[x];srank(t[x][1],y);}else srank(t[x][0],y);
}
inline void spre(int x,int y){if(x&#61;&#61;0)return;if(val[x]1],y);}else spre(t[x][0],y);
}
inline void ssucc(int x,int y){if(x&#61;&#61;0)return;if(val[x]>y){ans&#61;min(ans,val[x]);ssucc(t[x][0],y);}else ssucc(t[x][1],y);
}
inline void winsert(int l,int r,int x,int v,int nod){sinsert(root[nod],v);if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;if(x<&#61;mid)winsert(l,mid,x,v,nod*2);else winsert(mid&#43;1,r,x,v,nod*2&#43;1);
}
inline void wrank(int l,int r,int x,int y,int k,int nod){if(l&#61;&#61;x&&r&#61;&#61;y){srank(root[nod],k);return;}int mid&#61;(l&#43;r)>>1;if(mid>&#61;y)wrank(l,mid,x,y,k,nod*2);else if(x>mid)wrank(mid&#43;1,r,x,y,k,nod*2&#43;1);else{wrank(l,mid,x,mid,k,nod*2);wrank(mid&#43;1,r,mid&#43;1,y,k,nod*2&#43;1);}
}
inline void wnum(int x,int y,int k){int l&#61;0,r&#61;oo,cnt;while(l<&#61;r){ans&#61;1;int mid&#61;(l&#43;r)>>1;wrank(1,n,x,y,mid,1);if(ans<&#61;k)cnt&#61;mid,l&#61;mid&#43;1;else r&#61;mid-1;}return cnt;
}
inline void whuan(int l,int r,int x,int y,int v,int nod){sshan(root[nod],y);sinsert(root[nod],v);if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;if(x<&#61;mid)whuan(l,mid,x,y,v,nod*2);else whuan(mid&#43;1,r,x,y,v,nod*2&#43;1);
}
inline void wpre(int l,int r,int x,int y,int k,int nod){if(l&#61;&#61;x&&r&#61;&#61;y){spre(root[nod],k);return;}int mid&#61;(l&#43;r)>>1;if(mid>&#61;y)wpre(l,mid,x,y,k,nod*2);else if(x>mid)wpre(mid&#43;1,r,x,y,k,nod*2&#43;1);else{wpre(l,mid,x,mid,k,nod*2);wpre(mid&#43;1,r,mid&#43;1,y,k,nod*2&#43;1);}
}
inline void wsucc(int l,int r,int x,int y,int k,int nod){if(l&#61;&#61;x&&r&#61;&#61;y){ssucc(root[nod],k);return;}int mid&#61;(l&#43;r)>>1;if(mid>&#61;y)wsucc(l,mid,x,y,k,nod*2);else if(x>mid)wsucc(mid&#43;1,r,x,y,k,nod*2&#43;1);else{wsucc(l,mid,x,mid,k,nod*2);wsucc(mid&#43;1,r,mid&#43;1,y,k,nod*2&#43;1);}
}
int main()
{scanf("%d%d",&n,&m);for(int i&#61;1;i<&#61;n;i&#43;&#43;){scanf("%d",&a[i]);winsert(1,n,i,a[i],1);}int x,y,z,k;for(int i&#61;1;i<&#61;m;i&#43;&#43;){scanf("%d%d%d",&z,&x,&y);if(z&#61;&#61;1)scanf("%d",&k),ans&#61;1,wrank(1,n,x,y,k,1),printf("%d\n",ans);else if(z&#61;&#61;2)scanf("%d",&k),printf("%d\n",wnum(x,y,k));else if(z&#61;&#61;3)whuan(1,n,x,a[x],y,1),a[x]&#61;y;else if(z&#61;&#61;4)scanf("%d",&k),ans&#61;-oo,wpre(1,n,x,y,k,1),printf("%d\n",ans);else if(z&#61;&#61;5)scanf("%d",&k),ans&#61;oo,wsucc(1,n,x,y,k,1),printf("%d\n",ans);}return 0;
}


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
author-avatar
天佑忍者忍着
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有