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. Navicat远程连接服务器Mysql

    使用NAVICAT远程访问MYSQL的步骤 1.修改远程访问权限 //进入MySQL服务器或使用其它工具 xxxx@ubuntu:/$ mysql -h localhost -u root -p xx ...

  2. Vacant Seat(Atcoder-C-交互式题目)

    C - Vacant Seat Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement This i ...

  3. hexo博客的学习笔记

    这篇文章主要的作用是作为 .md文件打开,内部的格式为一个初学者对hexo以及markdown语法运用的笔记 1.Hexo的写文格式 最开始为文章的属性部分,以三横杠-开始,-结束.里面记录了文章的标 ...

  4. Linux上centOs6+安装mysql5.7详细教程 - 前端小鱼塘

    https://coyhom.github.io/ 人类的本质是复读机,作为一个非linux专业人员学习linux最好的办法是重复 环境centos6.5 版本5.7 1: 检测系统是否自带安装mys ...

  5. css之制作三角形

    箭头向上三角形 #triangle-up { width: 0; height: 0; border-left: 50px solid transparent; border-right: 50px ...

  6. 微软发布MS MARCO数据集,提高计算机阅读理解能力

    ​ MARCO数据集,提高计算机阅读理解能力" title="微软发布MS MARCO数据集,提高计算机阅读理解能力"> ​ 本文译自:Microsoft data ...

  7. Flask设置Access-Control_Allow_Origin实现跨域访问

    前端访问Flask的接口,浏览器报错:has been blocked by CORS policy: No 'Access-Control-Allow-Origin' heade 需要将Flask的 ...

  8. Java入门教程十一(异常处理)

    在程序设计和运行的过程中,发生错误是不可避免的.尽管 Java 语言的设计从根本上提供了便于写出整洁.安全代码的方法,并且程序员也尽量地减少错误的产生,但是使程序被迫停止的错误的存在仍然不可避免.为此 ...

  9. .ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容?

    ArrayList比较简单,主要是通过数组来实现的 需要注意的是其初始容量是10 /** * Default initial capacity. */ private static final int ...

  10. CSS+JS相应式导航菜单

    响应式导航菜单 响应式导航菜单就是当网页在其他不同视口的样式,不同的设备需要不同的样式 需要掌握的知识 - 掌握媒体查询,如果你不是很懂那就看我写的CSS响应式布局 掌握CSS重的display:no ...