博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3223 文艺平衡树
阅读量:5141 次
发布时间:2019-06-13

本文共 1811 字,大约阅读时间需要 6 分钟。

splay的区间翻转,splay(l-1,f[rot]),splay(r+1,rot);

之后将ch[ch[rot][1]][0]的子树翻转

理论简单,操作闹腾...

附上代码,splay区间操作入门题

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 #define N 10005010 #define get(rt) (ch[f[rt]][0]!=rt)11 #define PushUp(rt) if(rt)siz[rt]=siz[ch[rt][0]]+siz[ch[rt][1]]+112 int ch[N][2],f[N],siz[N],val[N];13 int rot,n,Q;14 bool tag[N];15 void PushDown(int x)16 { 17 if(!tag[x])return ;18 tag[x]=0;19 swap(ch[x][0],ch[x][1]);20 tag[ch[x][0]]^=1;21 tag[ch[x][1]]^=1; 22 }23 void rotate(int rt)24 {25 int x=f[rt],y=f[x],b=get(rt);26 ch[x][b]=ch[rt][b^1];f[ch[x][b]]=x;ch[rt][b^1]=x;f[x]=rt;f[rt]=y;27 if(y)ch[y][ch[y][0]!=x]=rt;28 PushUp(x);PushUp(rt);29 if(rot==x)rot=rt;30 }31 void splay(int rt,int y)32 {33 for(int fa;(fa=f[rt])!=y;rotate(rt))34 {35 if(f[fa]!=y)36 {37 rotate((get(rt)==get(fa))?fa:rt);38 }39 }40 }41 int find(int x)42 {43 int now=rot;44 while(1)45 {46 PushDown(now);47 if(x<=siz[ch[now][0]])now=ch[now][0];48 else49 {50 x-=siz[ch[now][0]]+1;51 if(!x)return now;52 now=ch[now][1];53 }54 }55 }56 void build(int fa,int l,int r)57 {58 if(l>r)return ;59 int m=(l+r)>>1;60 ch[fa][m>fa]=m;61 siz[m]=1;62 val[m]=m-1;63 f[m]=fa;64 build(m,l,m-1);65 build(m,m+1,r);66 PushUp(m);67 }68 void reverse(int x,int y)69 {70 x=find(x);71 y=find(y);72 splay(x,f[rot]);73 splay(y,rot);74 tag[ch[y][0]]^=1;75 }76 int main()77 {78 scanf("%d%d",&n,&Q);79 build(0,1,n+2);80 rot=(n+3)>>1;81 for(int i=1;i<=Q;i++)82 {83 int x,y;84 scanf("%d%d",&x,&y);85 reverse(x,y+2);86 }87 for(int i=2;i<=n;i++)printf("%d ",val[find(i)]);88 printf("%d\n",val[find(n+1)]);89 }
View Code

 

转载于:https://www.cnblogs.com/Winniechen/p/8692727.html

你可能感兴趣的文章
uCGUI字符串显示过程分析和uCGUI字库的组建
查看>>
h5唤起app
查看>>
SQL Server 2008 /SQL Server 2008 R2 配置数据库邮件
查看>>
[转]vs2010编译金山代码
查看>>
数学图形之Boy surface
查看>>
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“Manag
查看>>
01: socket模块
查看>>
mysql触发器
查看>>
淌淌淌
查看>>
MySQL-定时任务
查看>>
web页面实现指定区域打印功能
查看>>
使用PHP拆分中文字符串的方法(收藏) 小节
查看>>
android系统权限的管理
查看>>
win10每次开机都显示“你的硬件设置已更改,请重启电脑……”的解决办法
查看>>
因Window服务器自动更新并重启导致WebSphere服务停止服务故障一例
查看>>
如何开启safari的调试
查看>>
js深拷贝和浅拷贝
查看>>
node.js 基础学习笔记1
查看>>
如何在linux系统中设置静态ip地址
查看>>
二分查找法,折半查找原理
查看>>