BZOJ 3223 文艺平衡树 splay
2016-01-08 13:45
337 查看
在czl大神的帮助下,这splay的第一题终于搞定了,好像也不难了,是我太弱了,要加油。相信自己。也不难。
记住,翻转标记应该是bool的,不是int型的,开int会比较耗时(不过为什么结构体版的比数组快呢?是我打残了?)
记住,翻转标记应该是bool的,不是int型的,开int会比较耗时(不过为什么结构体版的比数组快呢?是我打残了?)
#include<cstdio> #include<iostream> #define rep(i,j,k) for(int i = j; i <= k; i++) #define lc c[k][0] #define rc c[k][1] using namespace std; const int maxn = 100233; int c[maxn][2], pa[maxn], s[maxn], root; bool rev[maxn]; int read() { int s = 0, t = 1; char c = getchar(); while( !isdigit(c) ){ if( c == '-' )t = -1; c = getchar(); } while( isdigit(c) ){ s = s * 10 + c - '0'; c = getchar(); } return s * t; } void maintain(int k) { s[k] = s[lc] + s[rc] + 1; } void build(int l,int r,int pre) { if( l > r ) return; int mid = (l+r)>>1; pa[mid] = pre; if( mid < pre ) c[pre][0] = mid; else c[pre][1] = mid; if( l < r ){ build(l,mid-1,mid); build(mid+1,r,mid); maintain(mid); } else s[mid] = 1; } void pushdown(int k) { if( rev[k] ){ rev[lc] ^= 1, rev[rc] ^= 1; swap(lc,rc); rev[k] ^= 1; } } void rorate(int k,int &root) { int fa = pa[k], gfa = pa[fa]; int l = c[fa][1] == k, r = l ^ 1; if( fa != root ){ c[gfa][c[gfa][1] == fa] = k; } else root = k; pa[fa] = k, pa[k] = gfa, pa[c[k][r]] = fa; c[fa][l] = c[k][r]; c[k][r] = fa; maintain(fa), maintain(k); } void splay(int k,int &root) { while( k != root ){ int fa = pa[k], gfa = pa[fa]; if( fa != root ){ if( c[fa][0] == k ^ c[gfa][0] == fa ) rorate(k,root); else rorate(fa,root); } rorate(k,root); } } int rank(int x,int k) { if( rev[k] ) pushdown(k); if( s[lc] >= x ) return rank(x,lc); else if( s[lc] + 1 < x ) return rank(x-s[lc]-1,rc); else return k; } void rever(int l,int r) { int x = rank(l,root), y = rank(r+2,root); splay(x,root); splay(y,c[x][1]); rev[c[y][0]] ^= 1; } int times = 0; int n, m; void out(int k) { if( rev[k] ) pushdown(k); if( lc ) out(lc); if( k != n+2 && k != 1 ) printf("%d ", k-1); if( rc) out(rc); } int main() { n = read(), m = read(); build(1,n+2,0); root = (3+n)>>1; rep(i,1,m){ int l = read(), r = read(); rever(l,r); } out(root); cout<<endl; return 0; }
相关文章推荐
- Android5.0+(CoordinatorLayout)
- python学习之数据类型
- 软件项目开发的标准化文档编写
- C#中怎么使控件随着窗体的大小改变而改变
- MFC捕捉子控件鼠标消息莫名奔溃
- 【CSS】文本水平对齐[CSS权威指南 学习笔记]
- [转]UML类图、关系及其JAVA代码
- 如何在UICollectionView reloadData后找到的某个cell
- Android Handler内存泄露
- 牛客网-《剑指offer》-二进制中1的个数
- Axure VS Mockplus VS Balsamiq - 原型图设计工具对比
- 1.3.1 DYNAMIC ROUTES(动态路由)
- IT公司100题-27-跳台阶问题
- C# 如何捕获一个USB设备发送到PC的数据
- iosURL字符串的URLencode 和 encodeURIComponent(base64) 去除get时因特殊字符至错
- 软件版本之Alpha、Beta、RC、GA、Release解惑
- 《从程序员到项目经理》内容记录
- 压缩文件,支持中文
- JQ 中 时间格式化和 时间的比较
- 5x8字符点阵的软件模拟