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 ...
随机推荐
- MySQL手注之联合查询注入
了解联合查询注入之前,先要了解一下什么是union? union是用于合并两个sql查询结果的语句. 要使用union 必须有相同的列数 必须有两条以上的select语句组成 列的数据类型必须兼容 ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
- 使用implicitly demo
泛型: Context Bounds // //定义一个隐式值, 这个值不能少, 要不找不到比较的对象 implicit val personCompartor = new Ordering[Per ...
- linux操作系统网卡漂移导致网络不可用
1.故障描述 公司有100-150台服务器安装RHEL7.4&中标麒麟7.4系统,为方便编辑配置网卡,使用脚本方式配置为biosname=0,ifname=0,目的是为将en1o2p此类长字符 ...
- Vue.js 学习笔记之二:数据驱动开发
在 Vue.js 框架中,与 HTML 页面元素的交互方式没有像原生 JavaScript 接口那么直接,它是通过先在 HTML 元素标签中嵌入一系列类似于普通标签属性的 Vue 指令属性来绑定数据, ...
- mysql-3-orderby
#进阶3:排序查询 /* 语法: SELECT FROM WHERE ORDER BY ASC|DESC */ USE myemployees; #案例1:查询员工信息,按工资从高到低排 SELECT ...
- matlab receive License Manager Error -103?
参考:https://www.mathworks.com/matlabcentral/answers/91874-why-do-i-receive-license-manager-error-103 ...
- Spring Cloud Config配置git私钥出错
重装了电脑之后,重新生成了ssh key文件id_rsa和id_rsa.pub文件. 然后在配置中心的配置了私钥之后启动项目,报错如下: Reason: Property 'spring.cloud. ...
- Axure实现vcg官网首页原型图
W240第二天第三天 Axure的简单使用: 作业实现:vcg官网首页原型图 帮助文档基础篇:原型图基础之axure线框图设计 导航栏设计: 添加通用母版header 导航栏设计注意: 鼠标移动到下面 ...
- dict, hash
dict: dictKey -- > dictVal example: dictEntry *dictFind(dict *d, const void *key) Key is like ...