BZOJ 3223 文艺平衡树
Description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
Input
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
Output
输出一行n个数字,表示原始序列经过m次变换后的结果
Sample Input
1 3
1 3
1 4
Sample Output
HINT
N,M<=100000
Source
splay区间操作大裸题不解释。
#include<queue>
#include<cstdio>
#include<cstdlib>
using namespace std; #define maxn 100010
const int inf = << ;
queue <int> team;
struct TREE
{
int ch[maxn][],fa[maxn],cnt,root;
int key[maxn],size[maxn],t[maxn]; inline int newnode()
{
if (team.empty()) return ++cnt;
int ret = team.front(); team.pop();
return ret;
} inline TREE()
{
root = newnode();
key[root] = -inf; ++t[root];
updata(root);
add(inf);
} inline int find(int rank,int have,int now)
{
if (have+size[ch[now][]]<rank&&have+size[ch[now][]]+t[now]>=rank) return now;
if (have+size[ch[now][]]+t[now]<rank) return find(rank,have+size[ch[now][]]+t[now],ch[now][]);
else return find(rank,have,ch[now][]);
} inline void updata(int now) { size[now] = size[ch[now][]] + size[ch[now][]] + t[now]; } inline void rotate(int x)
{
int y = fa[x],z = fa[y],l = ch[y][] != x,r = l ^ ;
if (z != ) ch[z][ch[z][] != y] = x;
fa[x] = z; fa[y] = x; fa[ch[x][r]] = y;
ch[y][l] = ch[x][r]; ch[x][r] = y;
updata(y); updata(x);
} inline void splay(int x,int aim)
{
int p = fa[aim];
while (fa[x] != p)
{
int y = fa[x],z = fa[y];
if (z != p)
{
if ((ch[z][] == y)^(ch[y][] == x)) rotate(x);
else rotate(y);
}
rotate(x);
}
if (aim == root) root = x;
} inline int search(int x)
{
int now = root;
while (now)
{
if (key[now] == x) break;
now = ch[now][x > key[now]];
}
return now;
} inline void add(int x)
{
int now = root,pre = ;
while (now)
{
pre = now;
now = ch[now][x > key[now]];
}
now = newnode();
fa[now] = pre; ch[pre][x > key[pre]] = now;
key[now] = x; ++t[now];
pre = now;
while (now)
{
updata(now);
now = fa[now];
}
splay(pre,root);
} inline int qrank(int x)
{
int now = root,ret = ;
while (key[now] != x)
{
if (x < key[now]) now = ch[now][];
else ret += size[ch[now][]] + t[now],now = ch[now][];
}
return ret + size[ch[now][]] + ;
} inline void insert(int x)
{
int p = search(x);
if (p)
{
splay(p,root);
++t[p];
updata(p);
}
else add(x);
} inline void del(int x)
{
int now = search(x),k = qrank(x);
int p = find(k-,,root),q = find(k + t[now],,root);
splay(p,root);
splay(q,ch[p][]);
if (--t[now])
{
updata(now);
updata(q);
updata(p);
}
else
{
ch[q][] = ; fa[now] = ;
updata(q);
updata(p);
team.push(now);
}
} inline int ask(int x,int sign)
{
int now = root,ret;
while (now)
{
if (sign)
{
if (key[now] > x)
ret = now,now = ch[now][];
else now = ch[now][];
}
else
{
if (key[now] < x)
ret = now,now = ch[now][];
else now = ch[now][];
}
}
return key[ret];
}
}tree; inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int main()
{
freopen("3224.in","r",stdin);
freopen("3224.out","w",stdout);
int T = read();
while (T--)
{
int opt = read();
if (opt == ) tree.insert(read());
else if (opt == ) tree.del(read());
else if (opt == ) printf("%d\n",tree.qrank(read())-);
else if (opt == ) printf("%d\n",tree.key[tree.find(read()+,,tree.root)]);
else if (opt == ) printf("%d\n",tree.ask(read(),));
else printf("%d\n",tree.ask(read(),));
}
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 3223 文艺平衡树的更多相关文章
- [题解]bzoj 3223 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3884 Solved: 2235[Submit][Sta ...
- bzoj 3223 文艺平衡树 - Splay
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3884 Solved: 2235[Submit][Sta ...
- BZOJ 3223 文艺平衡树 [codevs3303翻转区间]
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3223 通道2:http://codevs.cn/problem/3303/ 题目分析: 我 ...
- bzoj 3223 文艺平衡树 splay 区间翻转
Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 17715 Solved: 7769[Submit][Status][ ...
- bzoj 3223 文艺平衡树 Splay 打标志
是NOI2003Editor的一个子任务 #include <cstdio> #include <vector> #define maxn 100010 using names ...
- [bzoj3224]普通平衡树/3223文艺平衡树
这是一道很普通的题.. 最近花了很多时间来想要去干什么,感觉自己还是太拿衣服 做这道题是因为偶尔看到了lavender的blog和她的bzoj早期AC记录,就被题目深深地吸引到了,原因有二: 自己sp ...
- 3223. 文艺平衡树【平衡树-splay】
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
随机推荐
- Java HexString
byte[]和十六进制字符串相互转换 Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示. 所以我们就可以把每个byte转换成两个相应的16进制字符,即把by ...
- Windows 服务卸载之后 重新安装提示 “指定的服务已标记为删除”
背景: 将一个项目做成一个windows服务,在调试的时候,需要卸载.安装该服务,但提示下面的错误:“指定的服务已标记为删除”,进入服务管理界面,启动自己注册的服务,无法手动更改成启用模 ...
- [RxJS] Filtering operator: filter
This lesson introduces filter: an operator that allows us to let only certain events pass, while ign ...
- sql_mode :(STRICT_TRANS_TABLES与STRICT_ALL_TABLES 区别)
http://blog.csdn.net/wulantian/article/details/8905573 http://dev.mysql.com/doc/refman/5.7/en/sql-mo ...
- ARC和非ARC文件混编
在编程过程中,我们会用到很多各种各样的他人封装的第三方代码,但是有很多第三方都是在非ARC情况下运行的,当你使用第三方编译时出现和下图类似的错误,就说明该第三方是非ARC的,需要进行一些配置. 解决方 ...
- SQL Server 2008 安装指南
一.安装需求: 1.硬件需求条件 硬件 需求 处理器 最低:1.4 GHz(x64处理器)注意:Windows Server 2008 for Itanium-Based Systems 版本需要In ...
- gulp的点点滴滴
去年用gulp,但一直没有写篇博客,今天有时间无聊写一篇.... 什么是gulp?gulp的官网title上对这个工具有一个比较准确的定义,叫做:基于流的自动化构建工具.如果你查看它的网页源代码,还会 ...
- java String对象的创建(jvm).
本人目前也开始学习虚拟机,在java中,有很多种类型的虚拟机,其中就以sum公司(当然现在已经是oracle了)的虚拟机为例,介绍可能在面试的时候用到的,同时对自己了解String有很大帮助,这里仅仅 ...
- android SDK 代理配置(东北大学)
启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...
- 怎样在thinkphp里面执行原生的sql语句
$Model = new Model(); $sql = "select * from `order`"; $voList = $Model->query($sql); 只是 ...