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构造函数 ...
随机推荐
- jmeter(二十)阶梯式加压测试
性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间. 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:St ...
- Android 动态的给Button、TextView、ImageView等控件设置了background后,再设置padding属性时该属性不起作用
也许大家遇到这样一个问题,有时我们根据业务需要在一个ViewGroup中动态的(程序运行过程中)添加View.例如添加Button,就需要给Button添加background.padding.mar ...
- Canvas绘图优化之使用位图--基于createjs库
在地图上实时绘制大量(万级别)图形,实时绘制的原因是因为各个图形形状不同,图形要按照后端传送的参数来绘制. 用canvas绘制图形比较方便,javascript的api接口也比较简单.现在也有很多的j ...
- zookeepeer集群搭建
一.预备工作 1.zookeepeer需要安装JDK,至于版本,大家可以去官网查询一下.这里我安装的是JDK8. 2.需要开放zookeepeer用到的端口,默认端口2181.2888.3888,至于 ...
- 安卓自动化测试,贺晓聪之uiautomator设备和选择器~Python详解
1.设备对象 引入uiautomator,获取设备对象<所谓设备对象可理解为:Android模拟器或者真机> 语法:from uiautomator import device as d ...
- linux-RPM安装
vh可写可不写
- 第二次作业 --- 我对QQ的评测
腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功能,并可与多 ...
- Record for Individual Project ( Word frequency program )
1. 预计时间 ● 对问题总体的理解.规划:10 min ● 设计编写程序:5 h ● 调试: 分模块-40 min; 总体-40min ● 测试(性能分析).改进:1 h 2. 实际用时 ● 对 ...
- 个人博客Week3——案例分析
一.调研,评测 我使用的bing的WINDOWS客户端,其大致分为四个模块:词典.例句.翻译.应用. (1)“词典”模块 BUG:搜索”http“词条,界面显示http的相关,但是无法再回到最初的主界 ...
- NumsCount (java)
package com.home.test; import java.util.Arrays; public class NumsCount { public vo ...