解题思路

非常好的一道构造题。

在手动模拟几个样例(也许不止几个)之后呢。

就可以发现其实这些操作的开始以及最后几步是有相通之处的。

关于手动模拟的样例放在了文章末尾,需要的自取。

先考虑操作次数。

尝试探索答案的下界,设 x 为序列中相邻的相同元素对数。

那么初始为 \(x=0\),而最终 \(x=2(n-1)\).

且除了第一次操作每次操作最多可以使 x 加 2。

那么答案下界就是 n。

然后,通过手动模拟的样例可以发现:

除了三操作之外的所有操作,其实都可以通过递归从以前的状态转移过来。

接下来就是边界,我们发现其实每一次的递归都会把序列的长度缩小 8 。

因此,边界就是 \(\bmod\;8\) 之后的 4 种余数。

由于 3 的转移是不规则的,因此我们要将此种边界调整到 7。

其它

洛谷的评测机好像并不会告诉你这道题出错的地方。

我们可以自己写一个 Special_Judge 。

将 n 的大小以及自己的程序输出,放进去,看看最后的序列是否符合要求。

当然我也写了一份,放在后面

code

AC 代码

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=110;
int n;
void print(int x,int y) {printf("%lld to %lld\n",x,y);}
void Judge(int l)
{
print(l+1,l-2);
print(l+4,l+1);
print(l+2,l-4);
}
void solve(int l,int r)
{
if(r-l+1<=2) return ;
if(r-l+1==10)
{
print(r-2,l-2);
print(l+2,r-2);
print(r-4,l+2);
print(l-1,r-4);
print(r-1,l-1);
return ;
}
if(r-l+1==12)
{
print(r-2,l-2);
print(r-5,r-2);
print(l+1,r-5);
print(r-6,l+1);
print(l-1,r-6);
print(r-1,l-1);
return ;
}
if(r-l+1==14)
{
print(l+7,l-2);
print(l+4,l+7);
print(l+11,l+4);
print(l+2,l+11);
print(l+8,l+2);
print(l-1,l+8);
print(l+12,l-1);
return ;
}
print(r-2,l-2);
print(l+2,r-2);
solve(l+4,r-4);
print(l-1,r-5);
print(r-1,l-1);
}
signed main()
{
n=read();
if(n==3) Judge(1);
else solve(1,2*n);
return 0;
}

Special_Judge

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int n;
char ch[500];
void move(int y,int x)
{
ch[x]=ch[y];
ch[x+1]=ch[y+1];
ch[y+1]=ch[y]='_';
}
void print()
{
for(int j=2*n-1;j<=4*n;j++)
cout<<ch[j];
cout<<'\n';
}
signed main()
{
n=read();
fill(ch+1,ch+4*n+1,'_');
for(int i=2*n+1;i<=4*n;i++)
if(i&1) ch[i]='B';
else ch[i]='A';
for(int i=1,l,r;i<=n;i++)
{
l=read();
r=read();
print();
move(l+2*n,r+2*n);
}
print();
return 0;
}

样例

  • n=3
__BABABA
ABB__ABA
ABBBAA__
ABBB____
  • n=4
__BABABABA
ABBABAB__A
ABBA__BBAA
A__ABBBBAA
AAAABBBB__
  • n=5
__BABABABABA
ABBABABAB__A
ABBA__BABBAA
ABBAABB__BAA
A__AABBBBBAA
AAAAABBBBB__
  • n=6
__BABABABABABA
ABBABABABAB__A
ABBABABA__BBAA
ABB__ABAABBBAA
ABBAAAB__BBBAA
A__AAABBBBBBAA
AAAAAABBBBBB__
  • n=7
__BABABABABABABA
ABBABABAB__ABABA
ABBABA__BBAABABA
ABBABAABBBAAB__A
ABBA__ABBBAABBAA
ABBAAAABBB__BBAA
A__AAAABBBBBBBAA
AAAAAAABBBBBBB__

题解 P6892 [ICPC2014 WF]Baggage的更多相关文章

  1. UVA1025---A Spy in the Metro(DP)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913 Secret agent Maria was sent to Alg ...

  2. CF1578I Interactive Rays:ICPC WF Moscow Invitational Contest I 题解

    题意简述:在平面上有一个坐标 \((x_c,y_c)\) 和半径 \(r\) 都是整数的圆 \((1\leq r_c\leq \sqrt{x_c^2+y_c^2}-1)\),你可以询问不超过 \(60 ...

  3. LuoguP6904 [ICPC2015 WF]Amalgamated Artichokes 题解

    Content 已知常数 \(p,a,b,c,d\),我们知道,第 \(k\) 天的股价公式为 \(price_k=p\times(\sin(a\times k+b)+\cos(c\times k+d ...

  4. THUSC2017 Day1题解

    THUSC2017 Day1题解 巧克力 题目描述 "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有 ...

  5. AtCoder Grand Contest 038 题解

    传送门 这场表现的宛如一个\(zz\) \(A\) 先直接把前\(b\)行全写成\(1\),再把前\(a\)列取反就行 const int N=1005; char mp[N][N];int n,m, ...

  6. UVALive - 4787 ICPC WF 2010 Tracking Bio-bots【dp】

    UVa 4787 WF题果然不一样,本来想暴力搜索,数据太大了,数组都开不了.看题解也不太懂,记录一下书上的题解,以后再看: 此题是给出N*M的格子,有些地方是墙,不可走.求所有不能只通过向上或者向右 ...

  7. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  8. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  9. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. 入“坑”mybatis后如何挣脱?

    既然已经入"坑"mybatis了,你竟然还想着挣脱,我是不会让你挣脱的~ 当然我有一个算是挣脱的办法.那就是把它学会.理解透.这样我们也就不用在坑里一直徘徊,也算得上是一种挣脱吧! ...

  2. 给STM32MP157C-DK2烧录固件

    环境: 一台PC(window/linux) STM32CubeProgrammer 我下载到的是 2.1 版本(19\07\10下载的) 里面的文件是: 里面有 3 个文件,分别window.Lin ...

  3. CS 面试题目总结(问题+答案)

    开源了一个新的github仓库CS 面试题目总结(问题+答案),主要总结一些CS大厂常见的面试问题,所有的问题与答案参考了网络上的许多博客和github仓库,也希望各位读者能够对这个仓库进行补充,毕竟 ...

  4. Redis配置统计字典

    本章将对Redis的系统状态信息(info命令结果)和Redis的所有配置(包括Standalone.Sentinel.Cluster三种模式)做一个全面的梳理,希望本章能够成为Redis配置统计字典 ...

  5. 29、vi和vim用法详解

    vi类似于windows中的文本文件,用于普通的文本文件 vim:专家版的文件编辑器,用于shell程序型文件,带颜色,自检查语法 一般模式快捷键 O:光标到一行的首 $:光标到一行的尾 H:光标到整 ...

  6. 运行cmd时提示你可能没有适当的权限访问该项目

    Windows无法访问指定设备.路径或文件.你可能没有适当的权限访问该项目.   方法/步骤   在C:\Windows\System32目录下中找到cmd.exe文件   右键点击 "属性 ...

  7. 配置Oracle遇到问题<一>

    1, 将D:\app\product\11.2.0\dbhome_1\NETWORK复制到D:\app\product\instantclient_11_2.为了处理: 12154错误,不过没有解决. ...

  8. 明明是企业管理软件,CRM系统为何被抵触?

    小编在昨天的文章<CRM系统为什么没有达到预期效果?>中曾说过,CRM客户管理系统没有达到预期效果的其中一个原因是CRM系统的使用率太低,而根本的原因是员工的抵触.明明是企业管理大师,CR ...

  9. CRM系统不仅给企业带来更多收益而且提升销售效率

    将客户信息记录在CRM系统的数据库中,同时共享沟通数据给售前.售后.SDR等上下游,客户资源还能够按照分配规则分配给适合的销售人员,帮助更快成单.全面使用CRM系统会给企业带来更多业绩. 1.全方位客 ...

  10. CentOS-自定义SFTP用户及目录

    ftp功能说明:通过SSH启动CentOS的sftp功能 创建用户组及用户(sftp可变) $ groupadd sftp $ useradd -g sftp -s /sbin/nologin -d ...