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构造函数 ...
随机推荐
- Android学习之基础知识四-Activity活动3讲(Intent的使用)
主活动名称FirstActivity.java改为了MenuTest.java 一.什么是Intent: 1.Intent是Android程序中各组件之间进行交互的重要方式,不仅可以指明当前组件想要进 ...
- jmeter(五)JDBC Request
jmeter中取样器(Sampler)是与服务器进行交互的单元.一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录响应时间信息 有时候工作中我们需要对数据库发起请求或者对数据 ...
- 动手动脑(lesson2)
一·随机数生成问题 //信1605-3 20163683 蔡金阳 package lesson2; public class Suiji { private static final int N = ...
- I2S音频总线学习
IIS音频总线学习(一)数字音频技术 一.声音的基本概念 声音是通过一定介质传播的连续的波. 图1 声波 重要指标: 振幅:音量的大小 周期:重复出现的时间间隔 频率:指信号每秒钟变化的次数 声音按频 ...
- CF1110H Modest Substrings AC自动机、DP
传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个 ...
- DataWorks使用小结(二)——功能面板使用指南
一.数据开发 1.任务开发 新建表 野路子可以直接新建一个任务,粘贴DDL,手动运行任务即可完成建表 正常应当是在“数据管理”->数据表管理中建表: 支持可视化建表和DDL建表(配合之前的宏,建 ...
- core_cm4_simd.h文件是干嘛的?
core_cm4_simd.h文件用于simd指令,即单指令多数据流,这个只有ARMv7架构才有,Cortex m3 m4 m7是ARMv7架构,而Cortex m0 m1是没有的. 所以,在新建Co ...
- FSMC的个人理解
个人理解: FSMC相当于外部设备存储器地址在FSMC对应存储地址中的映射,通过在FSMC的存储地址中写数据,就能通过FSMC的地址线和数据线,将地址和数据写到外部设备存储器地址中.所以,程序中,需要 ...
- 面试2——java基础2
11.MVC设计模型 mvc设计模型是一种使用model-view-controller(模型-视图-控制器)设计创建web应用程序的模式.是一种开发模式,好处是可以将界面和业务逻辑分离. model ...
- 如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?
转自<知乎>如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文? 问题: 作为一个博士生,一直为写论文头疼,读过很多高质量论文,觉得写的真好,但是轮到自己写总 ...