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

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5

HINT

N,M<=100000

好久没写,水一发splay。。。。。。

 const
maxn=;
type
node=record
son:array[..]of longint;
a,fa,size:longint;
sw:boolean;
end;
var
f:array[..maxn]of node;
n,m,root:longint; function build(l,r,ff:longint):longint;
var
mid:longint;
begin
mid:=(l+r)>>;
f[mid].fa:=ff;
f[mid].size:=r-l+;
if mid>l then f[mid].son[]:=build(l,mid-,mid);
if (mid>) and (mid<n+) then f[mid].a:=mid-;
if mid<r then f[mid].son[]:=build(mid+,r,mid);
exit(mid);
end; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure new(x:longint);
begin
with f[x] do
begin
size:=f[son[]].size+f[son[]].size+;
if sw then
begin
swap(son[],son[]);
f[son[]].sw:=not f[son[]].sw;
f[son[]].sw:=not f[son[]].sw;
sw:=not sw;
end;
end;
end; function wh(x:longint):longint;
begin
if f[f[x].fa].son[]=x then exit();
exit();
end; procedure rotate(x,w:longint);
var
y:longint;
begin
y:=f[x].fa;
f[y].son[w]:=f[x].son[w xor ];
if f[x].son[w xor ]<> then f[f[x].son[w xor ]].fa:=y;
f[x].son[w xor ]:=y;
if root=y then root:=x
else f[f[y].fa].son[wh(y)]:=x;
f[x].fa:=f[y].fa;
f[y].fa:=x;
new(y);
end; procedure splay(x,z:longint);
var
y:longint;
begin
while f[x].fa<>z do
begin
y:=f[x].fa;
if f[y].fa<>z then
begin
if wh(x)=wh(y) then rotate(y,wh(y))
else rotate(x,wh(x));
end;
rotate(x,wh(x));
end;
new(x);
end; function find(k:longint):longint;
begin
find:=root;
while true do
begin
new(find);
if k=f[f[find].son[]].size+ then exit(find);
if k<=f[f[find].son[]].size then find:=f[find].son[]
else
begin
dec(k,f[f[find].son[]].size+);
find:=f[find].son[];
end;
end;
end; var
aa:array[..maxn]of longint;
tot:longint; procedure dfs(x:longint);
begin
new(x);
with f[x] do
begin
if son[]<> then dfs(son[]);
inc(tot);
aa[tot]:=a;
if son[]<> then dfs(son[]);
end;
end; procedure main;
var
i,l,r:longint;
begin
read(n,m);
root:=build(,n+,);
for i:= to m do
begin
read(l,r);
splay(find(l),);
splay(find(r+),root);
f[f[f[root].son[]].son[]].sw:=not f[f[f[root].son[]].son[]].sw;
end;
splay(find(),);
splay(find(n+),root);
dfs(f[f[root].son[]].son[]);
for i:= to n- do
write(aa[i],' ');
write(aa[n]);
end; begin
main;
end.

3223: Tyvj 1729 文艺平衡树 - BZOJ的更多相关文章

  1. BZOJ 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 2052[Submit][Sta ...

  2. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  3. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  4. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  5. 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1347  Solved: 724[Submit][Stat ...

  6. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

  7. [BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转

    题目不说了,就是区间翻转 传送门:BZOJ 3223 和 CodeVS 3243 第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...

  8. 【BZOJ】3223: Tyvj 1729 文艺平衡树(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3223 默默的.. #include <cstdio> #include <cstr ...

  9. bzoj 3223/tyvj 1729 文艺平衡树 splay tree

    原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...

随机推荐

  1. Android处理Bitmap使其能够不失真等比缩放裁剪后显示在ImageView上

    Android开发过程中,我们有时需要动态得显示一些图片,并且这些图片的大小差距会十分大,如果需求并不是需要图片完整显示,但是需要不失真,并且要图片中间部分的情况下,我们需要做一系列处理,因为这个时候 ...

  2. MySQL选择数据库use与mysql_select_db使用详解

      在mysql中如果我们在命令模式下选择与切换数据库直接使用use即可,在php中选择数据使用mysql_select_db即可,下面我来介绍一下.     从命令提示符,选择MySQL数据库: 这 ...

  3. 解决ASP.NET MVC3与FusionCharts乱码问题

    程序代码  代码如下 复制代码 <script type="text/javascript">    $(document).ready(function () {   ...

  4. Dos下查询关闭端口的命令例子

    1. 查看端口占用 在windows命令行窗口下执行: netstat -aon|findstr "8080" TCP     127.0.0.1:80         0.0.0 ...

  5. php 检查email电子邮件函数(奇葩写法)

    以前写的一个PHP表单电子邮件发送程序,其中采用如下方法来验证电子邮件地址格式是否正确: 代码如下 复制代码 eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0 ...

  6. UI1_UITableViewHomeWork

    // // AppDelegate.m // UI1_UITableViewHomeWork // // Created by zhangxueming on 15/7/14. // Copyrigh ...

  7. OC10_代理反向传值

    // // ProtectedDelegate.h // OC10_代理反向传值 // // Created by zhangxueming on 15/6/24. // Copyright (c) ...

  8. Spring AOP整理

    示例展示 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充.AOP之所以能得到广泛认可,主要是因为它将应用系统拆分分了 ...

  9. 巧用Excel分列功能处理数据

    Technorati 标签: 数据处理      今天,主要工作就是处理测试数据,统计汇总成图表来显示.先来说说要求,然后给出我在折腾这堆数据中遇到的问题以及解决方法.   问题要求:       格 ...

  10. (栈)栈 给定push序列,判断给定序列是否是pop序列

    题目: 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2. ...