【模板】文艺平衡树

题目链接

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列。

其中需要提供以下操作:翻转一个区间,例如原有序序列是 543215\ 4\ 3\ 2\ 15 4 3 2 1,翻转区间是 [2,4][2,4][2,4] 的话,结果是 523415\ 2\ 3\ 4\ 15 2 3 4 1

输入格式

第一行两个正整数 n,mn,mn,m ,表示序列长度与操作个数。序列中第 iii 项初始为 iii
接下来 mmm 行,每行两个正整数 l,rl,rl,r,表示翻转的区间。

输出格式

输出一行 nnn 个正整数,表示原始序列经过 mmm 次变换后的结果。

输入输出样例

输入 #1

5 3
1 3
1 3
1 4

输出 #1

4 3 2 1 5

说明/提示

对于 100%100\%100% 的数据,1≤n,m≤105,1≤l≤r≤n1 \le n, m \leq 10^5,1 \le l \le r \le n1n,m1051lrn


Solution

  • 模板题。

Code

FHQ Treap

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
const int maxn=1000020;
int n,m,root,tot;
struct FHQ{int lc,rc;int val,dat,siz,tag;
}tr[maxn];
inline int newnode(int v){tr[++tot].siz=1;tr[tot].val=v;tr[tot].dat=rand();return tot;
}
inline void pushup(int u){tr[u].siz=tr[tr[u].lc].siz+tr[tr[u].rc].siz+1;
}
inline void pushdown(int u){if(tr[u].tag){swap(tr[u].lc,tr[u].rc);tr[tr[u].lc].tag^=1;tr[tr[u].rc].tag^=1;tr[u].tag=0;}
}
inline int merge(int x,int y){if(!x||!y)return x+y;pushdown(x),pushdown(y);if(tr[x].dat<tr[y].dat){tr[x].rc=merge(tr[x].rc,y);pushup(x);return x;}else{tr[y].lc=merge(x,tr[y].lc);pushup(y);return y;}
}
inline void spilt(int u,int k,int &x,int &y){if(!u){x=y=0;return;}pushdown(u);if(k<=tr[tr[u].lc].siz)y=u,spilt(tr[u].lc,k,x,tr[u].lc);elsex=u,spilt(tr[u].rc,k-tr[tr[u].lc].siz-1,tr[u].rc,y);pushup(u);
}
inline int build(int l,int r){int mid=(l+r)>>1;int u=newnode(mid);if(l<mid)tr[u].lc=build(l,mid-1);if(mid<r)tr[u].rc=build(mid+1,r);pushup(u);return u;
}
inline void rev(int l,int r){int a,b,c,d;spilt(root,l-1,a,b);spilt(b,r-l+1,c,d);tr[c].tag^=1;root=merge(a,merge(c,d));
}
inline void print(int u){pushdown(u);if(tr[u].lc)print(tr[u].lc);if(tr[u].val>=1&&tr[u].val<=n)printf("%d ",tr[u].val);if(tr[u].rc)print(tr[u].rc);
}
int main(){srand(time(0));scanf("%d%d",&n,&m);root=build(0,n+1);for(int i=1;i<=m;++i){int l,r;scanf("%d%d",&l,&r);rev(l+1,r+1);}print(root);return 0;
}

Splay

#include<cstdio>
#include<algorithm>
const int maxn=100010;
struct Splay{int val,son[2],fa,tag,siz;
}tr[maxn];
int n,m,tot,root;
inline void pushup(int u){tr[u].siz=tr[tr[u].son[0]].siz+tr[tr[u].son[1]].siz+1;
}
inline void pushdown(int u){if(tr[u].tag){tr[tr[u].son[0]].tag^=1;tr[tr[u].son[1]].tag^=1;std::swap(tr[u].son[0],tr[u].son[1]);tr[u].tag=0;}
}
inline int build(int l,int r,int fa){int u=++tot;int mid=(l+r)>>1;tr[u].val=mid;tr[u].fa=fa;if(l<mid)tr[u].son[0]=build(l,mid-1,u);if(mid<r)tr[u].son[1]=build(mid+1,r,u);pushup(u);return u;
}
inline void rotate(int x){int y=tr[x].fa,z=tr[y].fa;int k=tr[y].son[1]==x;tr[z].son[tr[z].son[1]==y]=x,tr[x].fa=z;tr[y].son[k]=tr[x].son[k^1],tr[tr[x].son[k^1]].fa=y;tr[x].son[k^1]=y,tr[y].fa=x;pushup(y),pushup(x);
}
inline void splay(int x,int goal){while(tr[x].fa!=goal){int y=tr[x].fa,z=tr[y].fa;if(z!=goal)tr[y].son[1]==x^tr[z].son[1]==y?rotate(x):rotate(y);rotate(x);}if(!goal)root=x;
}
inline int ask(int u,int rank){pushdown(u);if(tr[tr[u].son[0]].siz>=rank)return ask(tr[u].son[0],rank);else if(tr[tr[u].son[0]].siz+1==rank)return u;else return ask(tr[u].son[1],rank-tr[tr[u].son[0]].siz-1);
}
inline void print(int u){pushdown(u);if(tr[u].son[0])print(tr[u].son[0]);if(tr[u].val>=1&&tr[u].val<=n)printf("%d ",tr[u].val);if(tr[u].son[1])print(tr[u].son[1]);
}
int main(){scanf("%d%d",&n,&m);root=build(0,n+1,0);while(m--){int l,r;scanf("%d%d",&l,&r);l=ask(root,l);r=ask(root,r+2);splay(l,0);splay(r,l);if(tr[r].son[0])tr[tr[r].son[0]].tag^=1;}print(root);return 0;
}

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

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

相关文章

P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】

正题 题目链接:https://www.luogu.com.cn/problem/P4022 题目大意 给出mmm个模板串。 然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超过90%90\%90%的部分拿出来分后每个串都是某个模板串的子串且长度不小于LLL。 所有输入文件长度不超过 110000011000001…

猜数(二分、线段树)

题目描述 对于一个长度为n的数列给出m个描述 每一个描述给出一个区间[a,b]的最小值的x 求从第几个描述开始矛盾 解析 本题关键是一个关于矛盾的充要条件&#xff1a; 如果存在一个最小值x&#xff0c;其所在的区间的交集&#xff08;就是它真正可以存在的区间&#xff09;是…

网络流专题(最大流与费用流)例题总结

文章目录NC 106056 poj1459 Power Network题目大意&#xff1a;题解&#xff1a;NC213817 [网络流24题]最小路径覆盖问题题目&#xff1a;题解&#xff1a;例2&#xff1a;NC213818 [网络流24题]魔术球问题题目&#xff1a;题解&#xff1a;方法2&#xff1a;NC 213820 [网络流…

FHQ Treap

FHQ Treap 主要通过 merge⁡\operatorname{merge}merge 和 spilt⁡\operatorname{spilt}spilt 两个核心操作和其他辅助函数来实现。 本文用 lcxlc_xlcx​ 表示 xxx 的左儿子&#xff0c;rcxrc_xrcx​ 表示 xxx 的右儿子&#xff0c;datxdat_xdatx​ 表示 xxx 的随机优先级 me…

从.Net框架Bug的提交到修复代码成功合并到.NET CoreFX主线

从发现.NET Framework中SmtpClient的Bug并拿出解决方案&#xff0c;然后给微软开发者社区提交Bug开始&#xff0c;总共耗时一个多月&#xff0c;对Bug修复的代码最终被采纳&#xff0c;现已合并到.NET Core Libraries (CoreFX)主线中。修复记录https://github.com/dotnet/coref…

P2469-[SDOI2010]星际竞速【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P2469 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;你每次可以选择一条s−>ts->ts−>t的路径花费AsA_sAs​的代价出发&#xff0c;而且只能从编号小的点到编号大的点走&#xff0c;求最小花费使得所有点被…

周期长度和(KMP)

文章目录题目描述解析问题总结代码题目描述 解析 我们可以看到 如果A是B的周期 那么B一定可以写成&#xff1a; A1A2A1 的形式 注意到&#xff1a;A1就是KMP中的公共前后缀 要使A最大&#xff0c;要使A1最短 也就是求最短公共前后缀 这怎么求呢&#xff1f; 我们注意到&#x…

计算几何基础-1

文章目录基本概念点与向量的运算精度问题线段&#xff0c;射线和直线点积&#xff1a;夹角叉积向量的极角旋转一个向量求三角形面积直线交点点到直线距离点在直线上的投影判断两条线段是否相交点与直线的位置关系点是否在直线左侧点是否在直线上点是否在线段上点与多边形的位置…

.net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

目录1.pod管理2.重启策略3.健康检查4.进入容器正文上一章我们已经通过yaml文件将.netcore程序跑起来了&#xff0c;但还有一下细节问题可以分享给大家。1.pod管理1.1创建podkubectl create -f netcore-pod.yaml我们创建一个netcore-pod.yaml文件&#xff0c;内容如下&#xff1…

【模板】可持久化并查集

题目链接 题目描述 给定 nnn 个集合&#xff0c;第 iii 个集合内初始状态下只有一个数&#xff0c;为 iii。 有 mmm 次操作。操作分为 333 种&#xff1a; 1 a b 合并 a,ba,ba,b 所在集合&#xff1b; 2 k 回到第 kkk 次操作&#xff08;执行三种操作中的任意一种都记为一次…

P1758-[NOI2009]管道取珠【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1758 题目大意 给出一个大小为nnn和一个大小为mmm的栈&#xff0c;每次选择一个栈弹出栈顶然后记录这个字母&#xff0c;求所有弹出序列的弹出方案的二次方和。 1≤n,m≤5001\leq n,m\leq 5001≤n,m≤500 解题思路 二次方和…

洛谷P2680:运输计划(倍增、二分、树上差分)

传送门 文章目录题目描述解析问题代码题目描述 解析 求最大值的最小值 容易想到二分 然后。。。就没有然后了。。。 看了题解 学会了一个新技能&#xff1a;树上差分 &#xff08;其实学长之前好像讲过。。。&#xff09; 一般的&#xff0c;对于一条A到B的路径&#xff0c;如…

Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】

正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的nnn个点&#xff0c;然后求有多少个矩形满足 左下角和右上角各有一个点矩形之间没有其他点 1≤n≤2105,1≤xi,yi≤109,1\leq n\leq 2\times 10^5,1\leq x_i,y_i\leq 10^9,1≤n≤2105,1≤xi​,yi​≤109,保证…

计算几何基础-2

文章目录直线&#xff1a;图形&#xff1a;求垂足求两圆交点直线与圆交点多边形问题判断一个点是否在任意多边形内部Pick定理凸包求点集的凸包水平法&#xff1a;增量法&#xff1a;半平面半平面交求半平面交直线&#xff1a; struct Line{point p,v;Line(){}Line(point _p.po…

eShopOnContainers 看微服务 ②:配置 启动

一、什么是dockerDocker 是一个开源项目&#xff0c;通过把应用程序打包为可移植的、自给自足的容器&#xff08;可以运行在云端或本地&#xff09;的方式&#xff0c;实现应用程序的自动化部署。使用 Docker 的时候&#xff0c;需要创建一个应用或服务&#xff0c;然后把它和它…

字符串距离(opj )(动态规划)

题目描述2988:计算字符串距离 对于两个不同的字符串&#xff0c;我们有一套操作方法来把他们变得相同&#xff0c;具体方法为&#xff1a; 修改一个字符&#xff08;如把“a”替换为“b”&#xff09;删除一个字符&#xff08;如把“traveling”变为“travelng”&#xff09;…

2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11260/C 题目大意 一个平面上&#xff0c;nnn个起点(0,ai)(0,a_i)(0,ai​)分别对应终点(i,0)(i,0)(i,0)&#xff0c;每次只能往上或者往左走。求不交路径数。 1≤n≤5105,ai<ai1,an≤1061\leq n\leq 5\times 10^5,a_i&…

[ZJOI2010]网络扩容[网络流24题]

[ZJOI2010]网络扩容[网络流24题] 题意&#xff1a; 给定一张有向图&#xff0c;每条边都有一个容量 c 和一个扩容费用 w。这里扩容费用是指将容量扩大 1 所需的费用。求&#xff1a; 在不扩容的情况下&#xff0c;1 到 n 的最大流&#xff1b; 将 1 到 n 的最大流增加 k 所需…

判断整除(opj)(动态规划)

解析 与取模结合的动归&#xff0c;正常做即可 问题 眼瞎&#xff01;&#xff01;&#xff01; 这个序列的每个数都必须用到&#xff01;&#xff01;&#xff01; if(f[i-1][j]) f[i][j]1;上面这行就是不对的&#xff01;&#xff01;&#xff01; 头疼 仔细审题 opj的题…

[CF850F] Rainbow Balls

题目链接 题目描述 给定 nnn 种颜色的球&#xff0c;每种球有 aia_iai​ 个&#xff0c;对这些球执行以下操作&#xff1a; 有顺序地任意取两个球&#xff0c;将第二个球涂上第一个球的颜色&#xff0c;重复该操作至所有球颜色相同。 求期望操作次数&#xff0c;对 109710^9…