Luogu3516 POI2011 Shift 构造
题意:给出一个长为$N$的排列,有两种操作:$A$:将最后一个数字放到第一个;$B$:将第三个数字放到第一个。一次性使用某种操作$k$次写作$kA$或$kB$,其中在$kA$中$k < N$,在$kB$中$k < 3$。请给出一种方案使得序列变为$1,2,3...N$。$N \leq 2000$
一道比较难的构造题
我们考虑增量构造:假如我们已经将$1-i$排好了,如何将$i+1$排到它们后面。我们可以进行如下操作:
$1.$通过若干$A$操作将$i+1$放到序列开头的位置
$2.$重复$2A,1B$操作将$i$与$i+1$之间不必要的数字两两踢到$i+1$后面
$3.$如果序列最后还有一个多余的数字,使用$1A,2B$操作将它踢到$i+1$后面
这样$i$与$i+1$就能相连了。
但是当我们需要将$n-1$接上时,会有一些问题:
我们考虑这样的一个序列:$$n-1,1,2,3...n-2,n$$
如果我们使用$1A,2B$操作,$n$就会夹在$1$和$2$中间,打乱了我们之前排好的顺序。所以当我们需要排$n-1$和$n$时,这种方法是不可行的。不妨考虑另外一种构造方法。
我们将$n$移到第一个,也就是$$n,n-1,1,2,3...n-2$$
然后我们使用一次$2A,1B$操作,然后序列就变成了……
$$n,n-3,n-2,n-1,1,2,3...n-4$$
发现$n$的位置没有变,但是后面$n-1$个数在循环。那么我们不断重复该操作,直到序列变成$$n,1,2,3...n-2,n-1$$就行了。但实际上在当前情况下当$n$为奇数的时候是不可行的,因为在移动若干次之后,序列会变成$$n,2,3,4...n-1,1$$,再一次重复该操作又会把$n-1$踢到前面去了。
可以发现所有操作都是$O(n)$级别的,总操作次数是$O(n^2)$级别的,与题设刚好一致
稍微注意一下输出
关于序列移动的模拟操作建议使用链表。如果比较懒,可以使用STL中的deque,开O2的情况下效率还是比较优秀的(不开O2是最慢的)
下面的代码:O2 497ms,无O2 2146ms
#include<bits/stdc++.h>
#define MAXN 5000010
using namespace std;
inline int read(){
;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return a;
}
char done[MAXN] , allDone[MAXN];
int step[MAXN] , allStep[MAXN] , pot[MAXN] , N , cnt;
deque < int > now;
inline void moveA(int s){
if(done[cnt] != 'a')
done[++cnt] = 'a';
step[cnt] += s;
; i <= s ; i++){
now.push_front(now.back());
now.pop_back();
}
}
inline void moveB(int s){
if(done[cnt] != 'b')
done[++cnt] = 'b';
step[cnt] += s;
; i <= s ; i++){
];
now[] = now[];
now[] = now[];
now[] = p;
}
}
inline void output(){
;
; i <= cnt ; i++)
if(done[i] != allDone[i]){
)){
allDone[++calc] = done[i];
allStep[calc] = step[i];
}
}
else
))
allStep[i] = (allStep[i] + step[i]) % (done[i] == );
else
allDone[calc--] = ;
cout << calc << endl;
; i <= calc ; i++)
cout << allStep[i] << allDone[i] << ' ';
}
int main(){
N = read();
; i <= N ; i++)
now.push_back(read());
){
putchar(');
;
}
else
){
cout << (now[] == ? " : "1\n1a");
;
}
; i < N - ; i++){
; j < N ; j++)
if(now[j] == i){
if(j)
moveA(N - j);
break;
}
] != i - )
] != i - ){
moveA();
moveB();
}
else{
moveA();
moveB();
}
}
; i < N ; i++)
if(now[i] == N){
if(i)
moveA(N - i);
break;
}
] == N - ){
){
puts("NIE");
;
}
] != N - ){
moveA();
moveB();
}
}
moveA(N - );
output();
;
}
Luogu3516 POI2011 Shift 构造的更多相关文章
- bzoj 2530 [Poi2011]Party 构造
2530: [Poi2011]Party Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 364 Solved: ...
- BZOJ2214[Poi2011]Shift——模拟
题目描述 Byteasar bought his son Bytie a set of blocks numbered from to and arranged them in a row in a ...
- BZOJ 2217: [Poi2011]Lollipop 构造 + 思维
Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T").现在有m个询问,每个询问是询问有没有一个连 ...
- 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做,由于特殊的关系,可以证明每次只能交换两个集 ...
- 洛谷P3516 PRZ-Shift [POI2011] 构造
正解:构造 解题报告: 传送门! umm这题就是很思维的?就是想到了就A了想不到就做不出来,然而我也只能是做到理解不知道怎么想出来,,,感觉构造题什么的就很真诚,一点套路也没有,所以像我这种没有脑子只 ...
- 【BZOJ2530】[Poi2011]Party (xia)构造
[BZOJ2530][Poi2011]Party Description 给定一张N(保证N是3的倍数)个节点M条边的图,并且保证该图存在一个大小至少为2N/3的团. 请输出该图的任意一个大小为N/3 ...
- bzoj 2528: [Poi2011]Periodicity【kmp+构造】
神仙构造,做不来做不来 详见:http://vfleaking.blog.163.com/blog/static/174807634201329104716122/ #include<iostr ...
- 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 ...
随机推荐
- js动态控制表单表格
js动态控制表单表格,这里操作只讲,添加一行,删除一行,删除某一行某一列. 直接放代码: <!DOCTYPE html> <html> <head> <met ...
- 在vue配置sass
先npm两个插件 npm install sass-loader --save-dev npm install node-sass --save-dev 然后在webpack当中配置 { test: ...
- 安卓开发_WebView设置打开网页缩放问题
之前实现打开网页的方式,测试后,发现不能够对网页进行缩放操作,这对部分网页来说是十分不便的, 百度了一下解决方案 其实只需要加几行代码就可以实现网页缩放操作 settings.setUseWideVi ...
- SQLite保存报错sqlite.SQLiteConstraintException: UNIQUE constraint failed: ······ code 1555
往数据库里保存数据的时候报错,用的afinal框架,明明在save操作之前执行了一遍deleteAll操作,还是报错. 百度了一下说报这种错有两种情况:一是定义的字段为not null ,插入时对应的 ...
- Android根据图片Uri获取图片path绝对路径的几种方法【转】
在Android 编程中经常会用到Uri转化为文件路径,如我们从相册选择图片上传至服务器,一般上传前需要对图片进行压缩,这时候就要用到图片的绝对路径. 下面对我开发中uri转path路径遇到的问题进行 ...
- (后端)excel设置日期格式的步骤
在excel中设置日期格式,分直接设置和代码设置. 一.直接设置: 选取日期所在的单元格,单元格右键菜单中--设置单元格格式.在单元格格式窗口中选数字类型为“日期”在右边的列表框中选取相应的日期格式即 ...
- scrapy系列(四)——CrawlSpider解析
CrawlSpider也继承自Spider,所以具备它的所有特性,这些特性上章已经讲过了,就再在赘述了,这章就讲点它本身所独有的. 参与过网站后台开发的应该会知道,网站的url都是有一定规则的.像dj ...
- [20180118]tstats的问题.txt
[20180118]tstats的问题.txt --//关于使用tstats收集处理统计信息,可以看链接http://blog.itpub.net/267265/viewspace-1987839/ ...
- 性能测试—认识JMeter(三)
<零成本web性能测试>第二章 JMeter基础知识总结和自己的理解 一.JMeter百度词条概念 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件 ...
- Centos 如何关闭自动更新
法一 安装Centos 6.5后,系统yum自动更新状态默认为开启,若禁止系统自动更新需要手动关闭. 1.进入yum目录 [root@localhost ~]$ cd /etc/yum 2.编辑yum ...