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 ...
随机推荐
- 基于NPOI的Excel导入导出类库
概述 支持多sheet导入导出.导出字段过滤.特性配置导入验证,非空验证,唯一验证,错误标注等 用于基础配置和普通报表的导入导出,对于复杂需求,比如合并列,公式,导出图片等暂不支持 GitHub地址: ...
- Metasploit之令牌窃取
令牌简介及原理 令牌(Token) 就是系统的临时密钥,相当于账户名和密码,用来决定是否允) 许这次请求和判断这次请求是属于哪一个用户的.它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源.这 ...
- Centos-yum软件包安装-yum
yum 自动安装相关软件依赖,可以同时配置多个yum源,初始启动yum时候首先会缓存资源包到 /var/cache/yum目录下 yum确认 -y yum安装和卸载 install 安装,自动安装软件 ...
- VS中OpenCV用imread读取不到图片
转自:https://blog.csdn.net/u012423865/article/details/78116059 在VS中OpenCV用imread读取不到图片 今天在Visual Studi ...
- visual studio 2015 Opencv4.0.1配置
最近由于工作需要,要配置opencv,我的电脑vs的version是2015,在网上下载了最新的opencv 4.0.1 自己摸索总是很困难,网上的例子也比较多,但版本比较低,也不确定适不适合vs20 ...
- 基于COCA词频表的文本词汇分布测试工具v0.2
update: 简单整理了一下代码的组织. 处理的单词封装成类,单词的修正,信息的显示都作为其内的方法. 写得还比较糙,工具本身可以封装,还有对于单词的变形基本没什么处理,以后有时间再改. 项目托管到 ...
- 跟随Javac代码来解答字节码的疑惑
前言 本文是跟随掘金小册张师傅的<JVM字节码从入门到精通>练习而写的. 问题 问题一: 有如下代码: 1 package com.sun.tools.javac; 2 3 /** 4 * ...
- ucore操作系统学习笔记(二) ucore lab2物理内存管理分析
一.lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源. 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管理.最初没有操作系统 ...
- SpringBoot整合Elasticsearch游标查询(scroll)
游标查询(scroll)简介 scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价. 游标查询会取某个时间点的快照数据. 查询初始化之后 ...
- BASH让标准输出和错误输出颜色不同
shell中运行的程序输出有标准输出(stdout)和错误输出(stderr)两种.当在终端中运行一个进程时,默认是stdout和stderr混在一起的,需要区分只能去读内容,人眼不容易快速区分. 如 ...