[BZOJ3223][Tyvj1729]文艺平衡树
来源:互联网 发布:sqlserver is null 编辑:程序博客网 时间:2024/05/01 12:59
题目大意
一开始有个数列
请输出最后的序列。
题目分析
一道写出blog都不知道有什么意义的splay大裸题。
splay在我还是pas党的时候写过,现在已经忘了个精光。
就当做是模板记录,以及作为自己终于下定决心怒刚专题的纪念吧。
什么你告诉我你不知道这题怎么做?那我也没办法了。
代码实现
一份自认为写得很好看的splay代码。
#include <iostream>#include <cstdio>#include <cctype>#include <stack>using namespace std;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:1,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}int buf[30];void write(int x){ if (x<0) putchar('-'),x=-x; for (;x;x/=10) buf[++buf[0]]=x%10; if (!buf[0]) buf[++buf[0]]=0; for (;buf[0];putchar('0'+buf[buf[0]--]));}const int N=100050;bool tag[N];int n,q;struct SPLAY{ int son[N][2],val[N],fa[N],size[N]; stack<int> st; int root; bool side(int x){return x==son[fa[x]][1];} void update(int x){size[x]=size[son[x][0]]+size[son[x][1]]+1;} void rotate(int x) { int y=fa[x];bool s=side(x); if (fa[y]) son[fa[y]][side(y)]=x; if (son[x][s^1]) fa[son[x][s^1]]=y; son[y][s]=son[x][s^1],son[x][s^1]=y; fa[x]=fa[y],fa[y]=x; update(y),update(x); } void R(int x){swap(son[x][0],son[x][1]),tag[x]^=1;} void clear(int x) { if (tag[x]) { if (son[x][0]) R(son[x][0]); if (son[x][1]) R(son[x][1]); tag[x]=0; } } void pushdown(int x,int y) { for (;x!=y;x=fa[x]) st.push(x); for (;!st.empty();clear(st.top()),st.pop()); } void splay(int x,int y) { for (pushdown(x,y);fa[x]!=y;rotate(x)) if (fa[fa[x]]!=y) if (side(x)==side(fa[x])) rotate(fa[x]); else rotate(x); } void init() { for (int i=2;i<=n;++i) val[i]=i,son[fa[i]=i-1][1]=i,size[i]=n-i+1; size[1]=n,root=1,splay(n,0),root=n; } int kth(int x,int y) { clear(x); if (size[son[x][0]]+1==y) return x; return size[son[x][0]]>=y?kth(son[x][0],y):kth(son[x][1],y-size[son[x][0]]-1); } void split(int x,int y,int &l,int &r) { if (y==0) l=0,r=x; else splay(y=kth(x,y),0),fa[r=son[y][1]]=0,son[y][1]=0,update(l=y); } void merge(int x,int y,int &rt) { if (!x) rt=y; else if (!y) rt=x; else { splay(x=kth(x,size[x]),0); fa[y]=x,son[x][1]=y,update(rt=x); } } void reverse(int l,int r) { int x,y,mid; split(root,r,x,y),split(x,l-1,x,mid),R(mid),merge(x,mid,x),merge(x,y,root); } void display(int x) { clear(x); if (!x) return; display(son[x][0]),write(x),putchar(' '),display(son[x][1]); }}t;int main(){ freopen("literature.in","r",stdin),freopen("literature.out","w",stdout); n=read(),q=read(),t.init(); for (int i=1,l,r;i<=q;++i) l=read(),r=read(),t.reverse(l,r); t.display(t.root),putchar('\n'); fclose(stdin),fclose(stdout); return 0;}
0 0
- bzoj3223 Tyvj1729 文艺平衡树
- 【BZOJ3223】Tyvj1729文艺平衡树
- [BZOJ3223][Tyvj1729]文艺平衡树
- bzoj3223==tyvj1729 文艺平衡树
- [Tyvj1729]文艺平衡树
- 【bzoj3223】文艺平衡树
- BZOJ3223文艺平衡树
- [bzoj3223]文艺平衡树
- bzoj3223 文艺平衡树
- bzoj3223 文艺平衡树
- BZOJ3223 文艺平衡树
- BZOJ3223 文艺平衡树
- bzoj3223 文艺平衡树
- 【BZOJ3223】文艺平衡树
- bzoj3223 文艺平衡树 treap
- [BZOJ3223] 文艺平衡树 - splay
- [BZOJ3223]文艺平衡树 splay
- BZOJ3223 文艺平衡树 题解
- 串的模式匹配-BF算法
- Java从键盘接收单个字符并转化为Unicode
- 010-图像移动与对齐
- python爬取学校体育部的跑超数据并用Tkinter写出应用并进行封装生成exe文件
- fatal: unable to access : The requested URL returned error: 403
- [BZOJ3223][Tyvj1729]文艺平衡树
- 四元傅里叶显著性图-四元数-Matlab编程
- Android多线程多进程学习网址
- 图像处理之简化色彩(含OpenCV代码)
- int64
- 我的第二次RNAseq分析
- LCD驱动程序(四)测试
- 求n以内的最大素数,若n最大为21亿
- ConcurrentHashMap复合操作问题