题目描述 Description

【dzy493941464|yywyzdzr原创】

小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数各不相同。

比如下图是N=5的一种情况:3 4 2 1 5

接下来你需要按小A的要求反转卡片,使得左数第一张卡片上的数字是1。操作方法:令左数第一张卡片上的数是K,如果K=1则停止操作,否则将左数第1~K张卡片反转。

第一次(K=3)反转后得到:2 4 3 1 5

第二次(K=2)反转后得到:4 2 3 1 5

第三次(K=4)反转后得到:1 3 2 4 5

可见反转3次后,左数第一张卡片上的数变成了1,操作停止。

你的任务是,对于一种排列情况,计算要反转的次数。你可以假设小A不会让你操作超过100000次。

输入描述 Input Description

第1行一个整数N

第2行N个整数,为1~N的一个全排列。

输出描述 Output Description

仅1行,输出一个整数表示要操作的次数。

如果经过有限次操作仍无法满足要求,输出-1。

样例输入 Sample Input

5

3 4 2 1 5

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

0<N≤300,000。

splay翻转裸题,又调了一个下午

 #include<iostream>
#include<cstdio>
using namespace std;
const int N=;
int size[N],c[N][],rev[N],fa[N],id[N],a[N];
int n,rt;
void pushup(int k){
int l=c[k][],r=c[k][];
size[k]=size[l]+size[r]+;
} void pushdown(int k){
if (rev[k]){
int l=c[k][],r=c[k][];
swap(c[k][],c[k][]);
rev[l]^=;rev[r]^=;
rev[k]=;//第一次k打成l,wa
}
} void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if (c[y][]==x)l=;else l=;r=l^;
if (y==k)k=x;
else if (c[z][]==y)c[z][]=x; else c[z][]=x;
fa[c[x][r]]=y; fa[x]=z; fa[y]=x;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
} void splay(int x,int &k){
while (x!=k){//忘记打这一句 wa*2
int y=fa[x],z=fa[y];
if (y!=k){
if (c[z][]==y^c[y][]==x) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} void build(int l,int r,int f)
{
if(l>r)return;
int mid=(l+r)>>;
if(mid<f)c[f][]=mid;//这句写错了 wa*3
else c[f][]=mid;
size[mid]=;fa[mid]=f;
if(l==r)return;
build(l,mid-,mid);build(mid+,r,mid);
pushup(mid);
} int find(int x,int rk){
pushdown(x);
int l=c[x][],r=c[x][];
if (size[l]+==rk) return x;
if (size[l]>=rk) return find(l,rk);
return find(r,rk-size[l]-);
} void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt); splay(y,c[x][]);
int z=c[y][];//这句写错了wa*4
rev[z]^=;
} int main(){
scanf("%d",&n);
for (int i=;i<=n+;i++) scanf("%d",&a[i]);
for (int i=;i<=n+;i++) id[i]=i;
build(,n+,); rt=(n+)>>;
int sum=;
bool flag=;
while (sum<=){
int mid=a[find(rt,)];
if (mid==){
flag=;
break;
}
sum++;
rever(,mid);
}
if (flag) printf("%d",sum);
else printf("-1");
}

codevs 1743 反转卡片的更多相关文章

  1. Codevs 1743 反转卡片(splay)

    1743 反转卡片 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description [dzy493941464|yywyzdzr原创] 小A将N ...

  2. codevs 1743 反转卡片 rope or splay

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

  3. [codevs1743]反转卡片

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

  4. 【codevs1743】 反转卡片

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

  5. ●Splay的一些题

    ●个人感觉: 代码长: 函数多: (很套路): (很强的Splay,无愧于“区间王”) ●NOI2005维修数列 一个可以当模板学习的题,包含了众多操作(函数): 区间插入,删除,更新,翻转,询问信息 ...

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

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

  7. codevs 1704 卡片游戏

    题目描述 Description 桌面上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张排时进行一下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后.输入n. ...

  8. CODEVS 1205 单词反转

    嗯.... 这道题看起来挺像一个字符串的题,但其实却错了,它实质上却用了一个栈进行了一个模拟(当然还有一种鬼畜的做法,下面也会介绍到..... 首先先看题: 时间限制: 1 s 空间限制: 12800 ...

  9. Codevs 1205 单词反转(Vector以及如何输出string)

    题意:倒序输出句子中的单词 代码: #include<cstdio> #include<iostream> #include<string> #include< ...

随机推荐

  1. VIM7.3中文手册

    INDEX *index.txt*     For Vim version 7.3.  最近更新: 2010年7月 VIM 参考手册    by Bram Moolenaar 译者: Willis h ...

  2. Android 自定义View修炼-高仿猎豹清理大师自定义内存开口圆环比例进度View

    一.概述 看见猎豹清理大师的内存开口圆环比例进度 挺有意思的,于是就是想自己实现下这样的效果,于是反编译了猎豹清理 大师的app看了下,原来是有两张图,于是脑子里就过了下思路,利用上下两张图,旋转上面 ...

  3. Java基础知识强化之网络编程笔记20:Android网络通信之 Android常用OAuth登录和分享

    1.  申请百度开发者账号及百度OAuth简介. (1)申请开发者账号: http://developer.baidu.com/ (2)创建项目: http://developer.baidu.com ...

  4. Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈

    1. TCP协议上传图片并给出反馈: (1)客户端: package cn.itcast_13; import java.io.BufferedInputStream; import java.io. ...

  5. 给Chrome和Firefox添加js脚本作为插件的方法

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5973141. ...

  6. mysql修改主键

    先删除所有主键 alter table tableName drop primary key; 然后添加主键 alter table tableName primary key(id);//如果是联合 ...

  7. CSS3选择器使用小结

    CSS3 选择器小结 一 通用选择器 1  *{}通配选择符(CSS2):适合所有元素对象. 2  E类型(HTML)选择符(CSS1):以文档语言对象类型DOM作为选择符. 3  E#myid是id ...

  8. mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法

    http://www.jb51.net/article/58726.htm 今天发现网站有点慢,发现mysql日志中提示mysqld-nt: Out of memory (Needed 1677720 ...

  9. HTML <input> 标签的 type 属性

    HTML <input> 标签的 type 属性 HTML <input> 标签 实例 下面的表单拥有两个输入字段以及一个提交按钮: <form action=" ...

  10. Ant 入门

    参考: Ant官网     http://ant.apache.org/ 轻量级java ee企业应用实战(李刚)      Ant当前版本1.9.6      Ant基于Java     配置环境变 ...