Copy
#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std;
int n,m,root,tot = 0;
struct tree{
int ls,rs,v,siz,rnd,tag;
}tr[100005];
int add(int val)
{
tr[++tot] = (tree){0,0,val,1,rand(),0};
return tot;
}
void update(int x){tr[x].siz = tr[tr[x].ls].siz + tr[tr[x].rs].siz + 1;}
void pushdown(int x)
{
if (!x || !tr[x].tag) return;
swap(tr[x].ls,tr[x].rs),tr[x].tag = 0;
if (tr[x].ls) tr[tr[x].ls].tag ^= 1;
if (tr[x].rs) tr[tr[x].rs].tag ^= 1;
}
void build(int &rt,int l,int r)
{
if (l > r) return void(rt = 0);
int mid = l + r >> 1;
rt = add(mid);
build(tr[rt].ls,l,mid - 1),build(tr[rt].rs,mid + 1,r);
update(rt);
}
void split(int rt,int &x,int &y,int k)
{
if (!rt) return void(x = y = 0);
pushdown(rt);
if (k <= tr[tr[rt].ls].siz) y = rt,split(tr[rt].ls,x,tr[y].ls,k);
else x = rt,split(tr[rt].rs,tr[x].rs,y,k - tr[tr[rt].ls].siz - 1);
update(rt);
}
void merge(int &rt,int x,int y)
{
if (!x || !y) return void(rt = x + y);
pushdown(x),pushdown(y);
if (tr[x].rnd < tr[y].rnd) rt = x,merge(tr[rt].rs,tr[x].rs,y);
else rt = y,merge(tr[rt].ls,x,tr[y].ls);
update(rt);
}
void reverse(int &rt,int l,int r)
{
int x = 0,y = 0,z = 0;
split(rt,x,y,r),split(x,x,z,l - 1);
tr[z].tag ^= 1,merge(x,x,z),merge(rt,x,y);
}
void dfs(int rt)
{
if (!rt) return;
pushdown(rt);
dfs(tr[rt].ls);
printf("%d ",tr[rt].v);
dfs(tr[rt].rs);
}
int main()
{
srand(time(NULL));
scanf("%d%d",&n,&m);
build(root,1,n);
for (int i = 1,q,p; i <= m; i++)
scanf("%d%d",&q,&p),reverse(root,q,p);
dfs(root);
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法