BZOJ2214[Poi2011]Shift——模拟
题目描述
Byteasar bought his son Bytie a set of blocks numbered from to and arranged them in a row in a certain order. Bytie's goal is to rearrange the blocks so that they are ordered naturally, from the smallest number to the largest. However, the only moves Bytie is allowed to make are: putting the last block at the very beginning (move a), and putting the third block at the very beginning (move b). Help Bytie by writing a program that tells whether a given arrangement of blocks can be properly reordered, and tells the right sequence of moves if it is.
有一个1..n的排列,有两种操作:
(a) 将最后一个数移到最前面
(b) 把第三个数移到最前面
我们将连续进行k次同一个操作称为“一块操作”,表示为ka或kb。
找到一个操作序列使得进行这些操作后,排列变为1,2,3,...,n。
输入
In the first line of the standard input there is a single integer ,(1<=N<=2000). In the second line there are integers from the range to , separated by single spaces. No number appears twice, and thus they represent the initial arrangement of the blocks. .
第一行n(1<=n<=2000)
下面一行n个数表示这个排列。
输出
如果不存在这样的操作序列,输出"NIE DA SIE",否则
第一行m,表示操作的块数。
下面一行,表示这m块操作。
需要满足相邻两块操作的种类不同,每块操作中进行的次数大于0小于n。
需要满足m<=n*n
样例输入
4
1 3 2 4
Sample Output #1
4
3a 2b 2a 2b
Sample Input #2
7
1 3 2 4 5 6 7
Sample Output #2
NIE DA SIE
Sample Input #3
3
1 2 3
Sample Output #3
0
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int now;
int tot;
int f[2010];
int a[2010];
int p[2010];
int c[4000010];
bool vis[4000010];
int pos(int x)
{
return (now+p[x]-1)%n+1;
}
int get(int x)
{
return ((x-now-1)%n+n)%n+1;
}
void make1(int x)
{
x%=n;
if(!x)
{
return ;
}
now+=x;
c[++tot]=x;
vis[tot]=0;
}
void make2()
{
int s1=get(1);
int s2=get(2);
int s3=get(3);
int x=f[s1];
int y=f[s2];
int z=f[s3];
int t=p[x];
p[x]=p[y];
p[y]=p[z];
p[z]=t;
f[p[x]]=x;
f[p[y]]=y;
f[p[z]]=z;
c[++tot]=1;
vis[tot]=1;
}
void print()
{
int ans=0;
for(int i=1;i<=tot;i++)
{
if(i==1||vis[i]!=vis[ans])
{
ans++;
vis[ans]=vis[i];
c[ans]=c[i];
}
else
{
c[ans]+=c[i];
}
}
tot=ans;
ans=0;
for(int i=1;i<=tot;i++)
{
if(vis[i]==0)
{
c[i]%=n;
}
else
{
c[i]%=3;
}
if(c[i])
{
c[++ans]=c[i];
vis[ans]=vis[i];
}
}
printf("%d\n",ans);
int i;
for(i=1;i<ans;i++)
{
if(vis[i]==0)
{
printf("%da ",c[i]);
}
else
{
printf("%db ",c[i]);
}
}
if(ans)
{
if(vis[i]==0)
{
printf("%da\n",c[i]);
}
else
{
printf("%db\n",c[i]);
}
}
}
int main()
{
scanf("%d",&n);
if(n==1)
{
printf("0\n");
return 0;
}
if(n==2)
{
scanf("%d%d",&a[1],&a[2]);
if(a[1]==1)
{
printf("0\n");
return 0;
}
else
{
printf("1\n1a\n");
return 0;
}
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
p[a[i]]=i;
f[i]=a[i];
}
for(int i=2;i<=n-2;i++)
{
int x=pos(i);
make1(n-x+1);
int t=n-pos(i-1);
while(t>1)
{
t-=2;
make1(2);
make2();
}
if(t)
{
make1(1);
make2();
make2();
}
}
if(n==3)
{
make1(n-pos(1)+1);
}
if(f[get(2)]<f[get(3)])
{
make1(n-3);
print();
}
else
{
if(!(n%2))
{
make1(n-2);
for(int i=1;i<n/2;i++)
{
make2();
make2();
make1(n-2);
}
make1(n-2);
print();
}
else
{
printf("NIE DA SIE\n");
}
}
}
BZOJ2214[Poi2011]Shift——模拟的更多相关文章
- Luogu3516 POI2011 Shift 构造
传送门 题意:给出一个长为$N$的排列,有两种操作:$A$:将最后一个数字放到第一个:$B$:将第三个数字放到第一个.一次性使用某种操作$k$次写作$kA$或$kB$,其中在$kA$中$k < ...
- CF708A Letters Cyclic Shift 模拟
You are given a non-empty string s consisting of lowercase English letters. You have to pick exactly ...
- Codeforces 960 二进制构造子序列 完全二叉树shift模拟 主席树/MAP DP
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POI做题笔记
POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...
- Codeforces #259 Div.2
A. Little Pony and Crystal Mine 模拟题. 用矩阵直接构造或者直接根据关系输出 B. Little Pony and Sort by Shift 模拟题. 通过提供的操作 ...
- [转] 有趣的JavaScript原生数组函数
在JavaScript中,可以通过两种方式创建数组,Array构造函数和 [] 便捷方式, 其中后者为首选方法.数组对象继承自Object.prototype,对数组执行typeof操作符返回‘obj ...
- JavaScript原生数组函数
有趣的JavaScript原生数组函数 在JavaScript中,可以通过两种方式创建数组,构造函数和数组直接量, 其中后者为首选方法.数组对象继承自Object.prototype,对数组执行typ ...
- 有趣的JavaScript原生数组函数
本文由 伯乐在线 - yanhaijing 翻译.未经许可,禁止转载!英文出处:flippinawesome.欢迎加入翻译小组. 在JavaScript中,可以通过两种方式创建数组,Array构造函数 ...
随机推荐
- 【Codeforces 467D】Fedor and Essay
Codeforces 467 D 题意:给\(m\)个单词,以及\(n\)个置换关系,问将\(m\)个单词替换多次后其中所含的最少的\(R\)的数量以及满足这个数量的最短总长度 思路:首先将置 ...
- MySQL(十)操纵表及全文本搜索
一.创建表 MySQL不仅用于表数据操作,还可以用来执行数据库和表的所有操作,包括表本身的创建和处理. 创建表一般有如下两种方式: ①使用具有交互式创建和管理表的工具: ②直接使用MySQL语句操纵表 ...
- JsonUtils序列化与反序列化工具
直接见代码,需要引入的包如下文,需要谷歌的包. package com.cxf.value; import com.fasterxml.jackson.core.type.TypeReference; ...
- mvn打包到私服的命令
1.mvn clean package install -Dmaven.test.skip=true deploy 2.docker清楚Nexus私服上包的命令: a) docker exec -it ...
- Bootstrap动态轮播
一.前台界面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...
- spring boot + dubbo开发遇到过的异常
异常信息 NoClassDefFoundErrororg.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1162) Sessio ...
- SpringBoot日记——Spring的安全配置-登录认证与授权
安全是每个项目开发中都需要考虑的,比如权限控制,安全认证,防止漏洞攻击等. 比较常见的安全框架有:Apache的shiro.Spring Security等等,相信用shiro的用户群体更多,而sec ...
- 转:SpringMVC之类型转换Converter(GenericConverter)
转: http://blog.csdn.net/fsp88927/article/details/37692215 SpringMVC 之类型转换 Converter 1.1 目录 1.1 目录 1. ...
- KETTLE集群搭建
KETTLE集群搭建 说明: 本文档基于kettle5.4 一.集群的原理与优缺点 1.1集群的原理 Kettle集群是由一个主carte服务器和多个从carte服务器组成的,类似于master-sl ...
- Asp.net框架与SpringMvc框架简单分析
(此文为自我总结,错误很多请勿借鉴) 1.就前两天分析SpringMvc框架中是通过controler来实现跳转页面,通过mapping来实现数据连接 分析的方法又通过java的类之间进行相互调用,个 ...