http://codevs.cn/problem/1743/

splay区间翻转。

数字在原序列中的位置保存在splay的data[]中。splay中点的编号为原序列的数字大小。

每次pushdown只在find时进行就行,因为find结束时splay只会改动i点祖先的信息,而其余时候没有splay操作了。

记得加个+INF 一个-INF。

 #include<cstdio>
#include<algorithm>
using namespace std;
#define N 400000
#define INF 2000000000
int lazy[N],s[N][],f[N],cnt[N],data[N],root,total;//son:1left 2right
int fi,num,p,q,le[N],m,n,i,j,ans;
char opt;
struct lbz
{
int a,b;
}x[N];
bool cmp(lbz a,lbz b)
{
return a.a<b.a;
}
void rotate(int x,int w)//w:1leftZag 2rightZig
{
int y;
y=f[x];
cnt[y]=cnt[y]-cnt[x]+cnt[s[x][w]];
cnt[x]=cnt[x]-cnt[s[x][w]]+cnt[y];
s[y][-w]=s[x][w];
if (s[x][w]!=)
f[s[x][w]]=y;
f[x]=f[y];
if (f[y]!=)
if (y==s[f[y]][])
s[f[y]][]=x;
else
s[f[y]][]=x;
f[y]=x;
s[x][w]=y;
}
void splay(int x,int t)
{
int y;
while (f[x]!=t)
{
y=f[x];
if (f[y]==t)
if (x==s[y][])
rotate(x,);
else
rotate(x,);
else
if (y==s[f[y]][])
if (x==s[y][])
{
rotate(y,);
rotate(x,);
}
else
{
rotate(x,);
rotate(x,);
}
else
if (x==s[y][])
{
rotate(y,);
rotate(x,);
}
else
{
rotate(x,);
rotate(x,);
}
}
if (f[x]==) root=x;
} int sea(int x,int w)
{
int t;
t=x;
while ()
{
if (data[t]==w) break;
if (w<=data[t])
{
if (s[t][]==) break;
t=s[t][];
}
else
{
if (s[t][]==) break;
t=s[t][];
} }
splay(t,);
return t;
}
void add(int w)
{
int x;
if (total==)
{
total++;
f[]=;cnt[]=;data[]=w;root=;
return;
}
x=root;
while()
{
cnt[x]++;
if (w<=data[x])
{
if (s[x][]==) break;
x=s[x][];
}
else
{
if (s[x][]==) break;
x=s[x][];
}
}
total++;
data[total]=w;
f[total]=x;
cnt[total]=;
if (w<=data[x])
s[x][]=total;
else
s[x][]=total;
splay(total,);
} void pushdown(int x)
{
lazy[x]^=;
lazy[s[x][]]^=;
lazy[s[x][]]^=;
swap(s[x][],s[x][]);
}
int find(int k,int w)//w=1 Kthsmall;w=2 Kthbig
{
int i,t;
i=root;t=k;
if (lazy[i]==)
pushdown(i); while (t!=cnt[s[i][w]]+)
{ if (t>cnt[s[i][w]]+)
{
t-=cnt[s[i][w]]+;
i=s[i][-w];
}
else
i=s[i][w];
if (lazy[i]==)
pushdown(i);
}
splay(i,);
return i;
} int rec(int l,int r)
{
int ll,rr;
ll=find(l,);
rr=find(r+,);
splay(ll,);
splay(rr,ll);
lazy[s[rr][]]^=;
}
int main()
{
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d",&x[i].a);
x[i].b=i;
}
sort(x+,x++n,cmp);
for (i=;i<=n;i++)
add(x[i].b);
add();
add(-);
while ()
{
fi=find(,);
if (fi==) break;
rec(,fi);
ans++;
}
printf("%d\n",ans);
return ;
}

codevs1743的更多相关文章

  1. [codevs1743]反转卡片

    [codevs1743]反转卡片 试题描述 [dzy493941464|yywyzdzr原创] 小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数各不相同. 比如下图是N ...

  2. 【codevs1743】 反转卡片

    http://codevs.cn/problem/1743/ (题目链接) 题意 给出一个序列{a1,a2,a3···},要求维护这样一种操作:将前a1个数反转,若第a1等于1,则停止操作. Solu ...

  3. 【集训第四天·继续刷题】之 lgh怒刚ypj

    继续水题,终于完全掌握了伸展树了,好心痛QAQ. 1.codevs1343 蚱蜢 区间最大值查询+单点移动 最大值查询维护一个mx数组就行,单点移动么,先删除在插入 CODE: /* PS: 比较ma ...

  4. codevs 1743 反转卡片 rope or splay

    [codevs1743]反转卡片 题目描述 Description [dzy493941464|yywyzdzr原创] 小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数 ...

随机推荐

  1. JStorm:任务调度

    前一篇文章 JStorm:概念与编程模型 介绍了JStorm的基本概念以及编程模型方面的知识,本篇主要介绍自己对JStorm的任务调度方面的认识,主要从三个方面介绍: 调度角色 调度方法 自定义调度 ...

  2. PowerDesigner的文章

    来自iteye的PowerDesigner的相关文章,写的不错,这里引用一下 PD12 建模工具的使用 博客分类: PowerDesigner .net http://jpkc.zjbti.net.c ...

  3. 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(python语言)

    # 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? # 斐波那契数列:0,1,1,2,3,5,8,13, ...

  4. Java Design Patterns(2)

    1.Factory Design pattern 工厂设计模式的优点 (1)工厂设计模式提供了接口而不是实现的代码方法. (2)工厂模式从客户端代码中删除实际实现类的实例化.工厂模式使我们的代码更健壮 ...

  5. 解决android 无法打开 DDMS 中的data目录

    把上面操作一遍就可以了,如果还是不行你可以检查下 su 是不是输入错误了.

  6. Python如何规避全局解释器锁(GIL)带来的限制

    编程语言分类概念介绍(编译型语言.解释型语言.静态类型语言.动态类型语言概念与区别) https://www.cnblogs.com/zhoug2020/p/5972262.html Python解释 ...

  7. Git学习小结 ~ Lethe's Blog

    学习自https://www.liaoxuefeng.com/wiki/896043488029600 一.创建版本库 (1) git init 初始化一个Git仓库 (2)添加文件到Git仓库,分两 ...

  8. 通过git shell 在Github上传本地项目

    首先现在github上新建一个库,再进行如下操作,过程不赘述 1.打开git shell 2.cd到项目位置       // cd archives-vue 3.git init 4.Get add ...

  9. 网络编程之C10K

    网络编程之C10K 虽然在过去的十几年里C10K问题已经可以很好的解决,但学习网络编程时研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三, ...

  10. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...