CodeForces 578E Walking!
题意
略。
题解
好毒瘤啊,我最多就口胡第一问的样子吧。
第一问很显然(跟凤凰县探险队员一样显然),就是每次贪心选长度最大的满足条件的子序列,选不到就折返回来。所以折返的次数很明显就是选出子序列的个数 \(-1\)。
考虑第二问,很明显不能暴力拼接子序列,这样很容易被 hack。具体方法剩下的题解有讲。
注意到找到的子序列可以按照开头和结尾分成 \(4\) 类:LL
,LR
,RL
和 RR
。
首先有一个性质:可以将所有的 LR
拼在一起得到一个更长的 LR
,RL
同理。
接下来 LL
和 RR
有一个特殊的作用,就是将一段 LR
和一段 RL
拼起来,类似于 L...RL...LR...L
和 R...LR...RL...R
。(这里两个字母中间三个点表示一段子序列)
但是有些时候,没有 LL
和 RR
,但是有 LR
和 RL
,这两段是无法拼起来的。难道我们就这样失败了吗?没有的事!
我们可以通过已经有的 LR
和 RL
自己造一个 LL
和 RR
出来。具体地话就是考虑 LR
与 RL
中最后一个位置的关系。然后最后一个位置小的那个序列把最后一个位置给大的那个,然后 LR
就变成了 LL
,而 RL
就变成了 RR
。
然后这题就做完了。
代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=2e5+51;
ll n,tot,x,y,swp;
vector<ll>v[MAXN],vg[2],g[2][2];
char ch[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
int main()
{
scanf("%s",ch+1),n=strlen(ch+1);
for(register int i=1;i<=n;i++)
{
x=ch[i]=='R',vg[x^1].empty()?vg[x^1].push_back(++tot):(void)1;
y=vg[x^1].back(),v[y].push_back(i);
vg[x^1].pop_back(),vg[x].push_back(y);
}
printf("%d\n",tot-1);
for(register int i=1;i<=tot;i++)
{
g[v[i].size()&1][ch[v[i].back()]=='R'].push_back(i);
}
if(!g[0][0].empty()&&!g[0][1].empty()&&g[1][0].empty()&&g[1][1].empty())
{
x=g[0][0].back(),y=g[0][1].back();
v[x].back()<v[y].back()?1:(swap(x,y),swp=1);
v[x].push_back(v[y].back()),v[y].pop_back();
g[0][0].pop_back(),g[0][1].pop_back(),swp?swap(x,y):(void)1;
g[1][0].push_back(y),g[1][1].push_back(x);
}
if(g[1][0].size()!=g[1][1].size())
{
x=g[1][1].size()>g[1][0].size();
}
else
{
x=g[0][0].size()>g[0][1].size();
}
while(!g[0][x^1].empty())
{
for(register int i:v[g[0][x^1].back()])
{
printf("%d ",i);
}
g[0][x^1].pop_back();
}
while(!g[1][x].empty())
{
for(register int i:v[g[1][x].back()])
{
printf("%d ",i);
}
g[1][x].pop_back();
while(!g[0][x].empty())
{
for(register int i:v[g[0][x].back()])
{
printf("%d ",i);
}
g[0][x].pop_back();
}
x^=1;
}
}
CodeForces 578E Walking!的更多相关文章
- Codeforces.578E.Walking(构造)
题目链接 \(Description\) 给定一个长为\(n\)的足迹序列(只包含\(L,R\)两种字符),你需要\(LRLRLR...\)这样交替在\(L\)和\(R\)上走(第一步可以选择\(L\ ...
- Codeforces 1154D - Walking Robot - [贪心]
题目链接:https://codeforces.com/contest/1154/problem/D 题解: 贪心思路,没有太阳的时候,优先用可充电电池走,万不得已才用普通电池走.有太阳的时候,如果可 ...
- Codeforces Round #605 (Div. 3) B. Snow Walking Robot(构造)
链接: https://codeforces.com/contest/1272/problem/B 题意: Recently you have bought a snow walking robot ...
- Diagonal Walking v.2 CodeForces - 1036B (思维,贪心)
Diagonal Walking v.2 CodeForces - 1036B Mikhail walks on a Cartesian plane. He starts at the point ( ...
- Kuro and Walking Route CodeForces - 979C (树上DFS)
Kuro is living in a country called Uberland, consisting of nn towns, numbered from 11to nn, and n−1n ...
- codeforces 979 C. Kuro and Walking Route
C. Kuro and Walking Route time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- Codeforces Round #482 (Div. 2) C 、 Kuro and Walking Route(dfs)979C
题目链接:http://codeforces.com/contest/979/problem/C 大致题意 给出n个点,有n-1个边将他们链接.给出x,y,当某一路径中出现x....y时,此路不通.路 ...
- Codeforces Round #482 (Div. 2) :C - Kuro and Walking Route
题目连接:http://codeforces.com/contest/979/problem/C 解题心得: 题意就是给你n个点,在点集中间有n-1条边(无重边),在行走的时候不能从x点走到y点,问你 ...
- Codeforces Round #501 (Div. 3) 1015D Walking Between Houses
D. Walking Between Houses time limit per test 2 seconds memory limit per test 256 megabytes input st ...
随机推荐
- 微服务实战系列(十)-网关高可用之中间件Keepalived
1.场景描述 因为要做网关的高可用,用到了keepalived+nginx,来保证nginx的高可用,如下图: 安装了keepavlived,走了一些弯路,记录下吧,nginx的安装就不多说了,博客已 ...
- Git多人项目开发流程演练
1. 前言 本文利用 GitHub 平台进行一个多人项目开发流程的演练,以加深课上所学内容. 参考文献:五⼤场景玩转 Git,只要这一篇就够了! 2. 初始化项目 2.1 新建远程项目 一个多人项目通 ...
- JAVA运行环境 和 Java Applet的运行环境 的区别
Java小程序,也就是Java Applet,可以在Web浏览器中运行.Java Applet必须以<applet>脚本的形式嵌入到HTML页面中,才能在web浏览器中运行. 之前总以为本 ...
- 027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑“与”运算符
027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑"与"运算符 本文知识点:Java中的逻辑"与"运算符 逻辑运 ...
- sklearn训练模型的保存与加载
使用joblib模块保存于加载模型 在机器学习的过程中,我们会进行模型的训练,最常用的就是sklearn中的库,而对于训练好的模型,我们当然是要进行保存的,不然下次需要进行预测的时候就需要重新再进行训 ...
- 【题解】[ZJOI2009]假期的宿舍
\(\color{red}{Link}\) \(\text{Solution:}\) 把人和床看成点,问题转化为二分图. 于是,对于每一个在校生,我们建立出他的床点:然后对于每一个在校生,他们自己可以 ...
- CAD常用知识点
1.Ctrl+9:打开命令窗口: 2.删除标注或者其他(选择对象过滤器):输入fi后回车会出现对象选择过滤器窗口,以删除标注为例,点击选择过滤器-----标注 按以下顺序点击后回车, 框选要去掉的标注 ...
- 串口wifi
串口wifi 串口WiFi ZLAN7146是一款wifi转串口的wifi串口服务器.该串口服务器可以方便地使得串口设备连接到WIFI无线网络,实现串口设备的无线化网络升级.RS232接口支持全双工. ...
- pytest文档33-Hooks函数获取用例执行结果(pytest_runtest_makereport)
前言 pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发,可以根据自己的需求进行改造. 先学习下pytest_runtest_makereport这个钩子方法,可以更清晰的 ...
- docker查看ip
docker查看容器的网络ip docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' conta ...