codevs 1743 反转卡片
【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次。
第1行一个整数N;
第2行N个整数,为1~N的一个全排列。
仅1行,输出一个整数表示要操作的次数。
如果经过有限次操作仍无法满足要求,输出-1。
5
3 4 2 1 5
3
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 反转卡片的更多相关文章
- Codevs 1743 反转卡片(splay)
1743 反转卡片 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description [dzy493941464|yywyzdzr原创] 小A将N ...
- codevs 1743 反转卡片 rope or splay
[codevs1743]反转卡片 题目描述 Description [dzy493941464|yywyzdzr原创] 小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数 ...
- [codevs1743]反转卡片
[codevs1743]反转卡片 试题描述 [dzy493941464|yywyzdzr原创] 小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数各不相同. 比如下图是N ...
- 【codevs1743】 反转卡片
http://codevs.cn/problem/1743/ (题目链接) 题意 给出一个序列{a1,a2,a3···},要求维护这样一种操作:将前a1个数反转,若第a1等于1,则停止操作. Solu ...
- ●Splay的一些题
●个人感觉: 代码长: 函数多: (很套路): (很强的Splay,无愧于“区间王”) ●NOI2005维修数列 一个可以当模板学习的题,包含了众多操作(函数): 区间插入,删除,更新,翻转,询问信息 ...
- 【集训第四天·继续刷题】之 lgh怒刚ypj
继续水题,终于完全掌握了伸展树了,好心痛QAQ. 1.codevs1343 蚱蜢 区间最大值查询+单点移动 最大值查询维护一个mx数组就行,单点移动么,先删除在插入 CODE: /* PS: 比较ma ...
- codevs 1704 卡片游戏
题目描述 Description 桌面上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张排时进行一下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后.输入n. ...
- CODEVS 1205 单词反转
嗯.... 这道题看起来挺像一个字符串的题,但其实却错了,它实质上却用了一个栈进行了一个模拟(当然还有一种鬼畜的做法,下面也会介绍到..... 首先先看题: 时间限制: 1 s 空间限制: 12800 ...
- Codevs 1205 单词反转(Vector以及如何输出string)
题意:倒序输出句子中的单词 代码: #include<cstdio> #include<iostream> #include<string> #include< ...
随机推荐
- svn has stoped working
各种问各种搜 ,看来还得靠自己,,,,下面是解决方案; 如果你出现这种情况, 右键点击svn的选项,就弹出这个框框,,,,点击svn里的哪个选项都是弹出这个框框,,,,重新安装,重启,换各种版本安 ...
- ORCAL
select name from v$database;--查询当前数据库名: select instance_name from v$instance;--查询当前数据库实例名 select def ...
- 【转】oracle的substr函数的用法
[转]oracle的substr函数的用法 ) would return 'The' ) value from dual
- RabbitMQ 原文译03--发布和订阅
发布/订阅 在之前的案例中我们创建了一个工作队列,这个工作队列的实现思想就是一个把每一个任务平均分配给每一个执行者,在这个篇文章我们会做一些不一样的东西,把一个消息发送给多个消费者,这种模式就被称作& ...
- asp中的几个取整函数fix(),int(),round()的用法
asp中的几个取整函数是:fix(),int(),round(); Int(number).Fix(number)函数返回数字的整数部分.number 参数可以是任意有效的数值表达式.如果 numbe ...
- Access数据库在线压缩的实现方法
如果在 Access 数据库中删除数据或对象,或者在 Access 项目中删除对象,Access 数据库或 Access 项目可能会产生碎片并会降低磁盘空间的使用效率.压缩 Access 数据库或Ac ...
- 通用安全字符串输入,彻底替换server.htmlencode
Function HTMLEncode(Str) If Isnull(Str) Then HTMLEncode = "" Exit Function End If Str = Re ...
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumbe ...
- ios registerNib: and registerClass:
先看看apple官网简述: registerNib:forCellWithReuseIdentifier: Register a nib file for use in creating new co ...
- 禁用浏览器缓存Ajax请求
$.ajax({ url: 'url.php', cache: false, success: function(data){ //..... } }); 仅Get有缓存, Post不会缓存