这种高级数据结构太难搞了.........现在还是先照着别人的代码敲,做模板..........慢慢花时间来弄懂

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 301111
#define INF 0x7FFFFFFF
#define REP(i,s,t) for(int i=(s);i<=(t);++i)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define LL(x) x<<1
#define RR(x) x<<1|1
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std; int n,q,root,tot,cnt;
int size[MAX],ch[MAX][2],key[MAX],pre[MAX],num[MAX],lazy[MAX],node[MAX]; void newnode(int &x, int va,int fa) {
x = ++ tot;
ch[x][0] = ch[x][1] = 0;
pre[x] = fa;
lazy[x] = 0;
key[x] = va;
} void up(int x) {
size[x] = size[ch[x][0]] + size[ch[x][1]] + 1;
} void down(int x) {
if(lazy[x]) {
swap(ch[x][0],ch[x][1]);
lazy[ch[x][0]] ^= 1;
lazy[ch[x][1]] ^= 1;
lazy[x] = 0;
}
} void build(int &x,int L,int R,int fa) {
if(L > R) return ;
int mid = (L + R) >> 1;
newnode(x,mid,fa);
build(ch[x][0],L,mid-1,x);
build(ch[x][1],mid+1,R,x);
up(x);
} void init() {
root = tot = 0;
ch[0][0] = ch[0][1] = pre[0] = lazy[0] = size[0] = 0;
newnode(root,-1,0);
newnode(ch[root][1],-1,root);
size[root] = 2;
build(ch[ch[root][1]][0],1,n,ch[root][1]);
up(ch[root][1]);
up(root);
} void rotate(int x,int kind) { // 0 :左旋 1:右旋
int y = pre[x];
down(y);
down(x);
ch[y][!kind] = ch[x][kind];
pre[ch[x][kind]] = y;
if(pre[y]) ch[pre[y]][ch[pre[y]][1] == y] = x;
pre[x] = pre[y];
ch[x][kind] = y;
pre[y] = x;
up(y);
} void splay(int x,int g) {
down(x);
while(pre[x] != g) {
if(pre[pre[x]] == g) rotate(x,ch[pre[x]][0] == x);
else {
int y = pre[x];
int kind = (ch[pre[y]][0] == y);
if(ch[y][kind] == x) {
rotate(x,!kind) ;
rotate(x,kind);
} else {
rotate(y,kind);
rotate(x,kind);
}
}
}
up(x);
if(g == 0) root = x;
} int get_kth(int x,int k) {
down(x);
int s = size[ch[x][0]];
if(s == k-1) return x;
if(s >= k) return get_kth(ch[x][0],k);
else return get_kth(ch[x][1],k-s-1);
} int get_min(int x) {
down(x);
while(ch[x][0]) {
x = ch[x][0];
down(x);
}
return x;
} int get_max(int x) {
down(x);
while(ch[x][1]) {
x = ch[x][1];
down(x);
}
return x;
} int get_pre(int x) {
int now = ch[x][0];
while(ch[now][1]) {
now = ch[now][1];
}
return now;
} int get_suc(int x) {
int now = ch[x][1];
while(ch[now][0]) {
now = ch[now][0];
}
return now;
} void rev(int l,int r) {
int x = get_kth(root,l);
int y = get_kth(root,r+2);
splay(x,0);
splay(y,root);
lazy[ch[ch[root][1]][0]] ^= 1;
} void cut(int l,int r,int c) {
int x = get_kth(root,l);
int y = get_kth(root,r+2);
splay(x,0);
splay(y,root);
int tmp = ch[ch[root][1]][0];
ch[ch[root][1]][0] = 0;
up(ch[root][1]);
up(root);
int z = get_kth(root,c+1);
splay(z,0);
int m = get_min(ch[root][1]);
splay(m,root);
ch[ch[root][1]][0] = tmp;
pre[ch[ch[root][1]][0]] = ch[root][1];
up(ch[root][1]);
up(root);
} void print(int x) {
if(x == 0) return ;
down(x);
print(ch[x][0]);
if(cnt >= 1 && cnt <= n) {
if(cnt > 1) printf(" ");
printf("%d",key[x]);
}
cnt ++;
print(ch[x][1]);
} char str[11];
int a,b,c;
int main() {
while(scanf("%d%d",&n,&q) != EOF) {
if(n == -1 && q == -1) break;
init();
while(q--) {
scanf("%s",str);
if(str[0] == 'C') {
scanf("%d%d%d",&a,&b,&c);
cut(a,b,c);
}
if(str[0] == 'F') {
scanf("%d%d",&a,&b);
rev(a,b);
}
}
cnt = 0;
print(root);
puts("");
}
return 0;
}

HDU 3478 Play with Chain (Splay树)的更多相关文章

  1. HDU 3487 Play with Chain | Splay

    Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. HDU 3487 Play with Chain(Splay)

    题目大意 给一个数列,初始时为 1, 2, 3, ..., n,现在有两种共 m 个操作 操作1. CUT a b c 表示把数列中第 a 个到第 b 个从原数列中删除得到一个新数列,并将它添加到新数 ...

  3. hdu 3436 splay树+离散化*

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 1890 splay树

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  5. hdu3487 splay树

    Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. Splay树学习

    首先给出一论文讲的很好: http://www.docin.com/p-63165342.html http://www.docin.com/p-62465596.html 然后给出模板胡浩大神的模板 ...

  7. HDU 3966 & POJ 3237 & HYSBZ 2243 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  8. Splay树-Codevs 1296 营业额统计

    Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

  9. ZOJ3765 Lights Splay树

    非常裸的一棵Splay树,需要询问的是区间gcd,但是区间上每个数分成了两种状态,做的时候分别存在val[2]的数组里就好.区间gcd的时候基本上不支持区间的操作了吧..不然你一个区间里加一个数gcd ...

随机推荐

  1. WPF常用转换

    原文 WPF常用转换 以下是代码中常常用到的一些转换,整理如下,后续再不断完善: 1.string和Color的转换 //string转Color (Color)ColorConverter.Conv ...

  2. C语言中 移位操作运算

    移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...

  3. 如何在Eclipse配置Tomcat服务器

    链接地址:http://jingyan.baidu.com/article/3065b3b6efa9d7becff8a4c6.html 要想在Eclipse运行jsp文件,首先需要指定对应的服务器,即 ...

  4. WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)

    原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济 ...

  5. perl 继承 @ISA

    12.5 类继承 对Perl的对象剩下的内容而言,从一个类继承另外一个类并不需要给这门语法增加特殊的语法,当你调用一个方法的时候, 如果Perl在调用者的包里找不到这个字过程,那么他就检查@ISA数组 ...

  6. Android ListView条目全选功能,不用checkbox实现!

    大家好,翻了翻曾经的笔记,发现了一个我特别标记的功能,那就是ListView全选功能,顿时想起了我那个时候苦逼的生涯,因为我大学机械出身,大学毕业了都不知道什么叫代码,在58干了一段销售.实在是干不下 ...

  7. CSDN-Code平台使用过程中的5点经验教训

    昨天又创建了一个项目,fucms,可是本地一直没有权限提交,搞了非常久,试了几十次,都不行,我是非常的灰心和郁闷.  刚刚,和CSDN-Code的官方客服咨询了非常久非常久,最终摸索出来了一些心得体会 ...

  8. ASP.NET - 锚点跳转,用于回到顶部

    <a name ="top"></a> <a href ="#top">回到顶部</a> 第一行代码写在顶部,第 ...

  9. 解决Xcode 7编译错误:does not contain bitcode

    连接地址:http://jingyan.baidu.com/article/8065f87f96cf462331249801.html 好不容易更新到Xcode 7.0.1,重新编译代码,报错: do ...

  10. django admin manytomany获取所选字段值

    和一般views中前端数据的获取一样. def save_model(self, request, obj, form, change):         door_id_list= request. ...