codeforces733C
Epidemic in Monstropolis
有n条鱼排成一列,第i条鱼大小为ai,根据自然界的生存法则,相邻的两只鱼中,较大的鱼可以吃掉较小的鱼,如果两条鱼大小相等,则它们无法吃掉对方。当一条鱼i吃掉另一条鱼j后,它的体积会变成ai+aj,即获取小鱼的大小。小鱼因为消失故会在序列中被抹去。
例如,对于序列 [1, 2, 2, 2, 1, 2] ,有如下情况
- 第一条鱼无法吃掉任何一条鱼因为a1 = 1
- 第二条鱼无法吃掉第三条鱼因为 a2 = 2且 a3 = 2;
- 第二条鱼无法吃掉第五条鱼因为它们不相邻;
- 第二条鱼可以吃掉第一条鱼,吃掉以后a序列更新为 [3, 2, 2, 1, 2].
假设过了一段时间以后,原来的n条鱼只剩下 k (k ≤ n) 条, 第 j 条鱼大小为 bj.
试推导出一个合法的吃鱼顺序,使得a序列转变为b序列,若无法推导,输出NO。
Input
第一行一个整数n (1 ≤ n ≤ 500)
第二行n个整数 a1, a2, ..., an (1 ≤ ai ≤ 106)
第三行一个整数 k (1 ≤ k ≤ n)
第四行k个整数 b1, b2, ..., bk (1 ≤ bj ≤ 5·108)
Output
若无解,输出 "NO"
若有解,第一行输出 "YES".
接下来 n - k 行描述吃鱼的全部过程. 每行包含一个数字x和一个字符c。x表示序列中的第几条鱼,c表示吃的是左边还是右边的鱼,左边则c为'L',右边则c为'R'
要注意,每次吃掉一条鱼后,序列的长度会减1。
若有多组解,任意输出一组。
Example
Input
6
1 2 2 2 1 2
2
5 5
Output
YES
2 L
1 R
4 L
3 L
Input
5
1 2 3 4 5
1
15
Output
YES
5 L
4 L
3 L
2 L
Input
5
1 1 1 3 3
3
2 1 6
Output
NO
sol:略显蛋疼的模拟题,首先容易发现吃出来的大鱼一定是吃了连续的一段,所以每个bi可以对应a中的一段,但是因为每次吃一条鱼都会使得序列长度减1,然后就需要模拟了,一开始感觉可以用树状数组维护坐标,但是写了一会就放弃了,直接暴力吃暴力更新整段数组又不是不行(o(╥﹏╥)o)
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=; inline void F5(int x,int opt);
inline void Debug();
inline bool Solve(int l,int r); int n,m;
int a[N],b[N],c[N],d[N];
int ans[N],Fx[N];
inline void F5(int x,int opt)
{
a[x]+=a[x+opt];
a[x+opt]=;
memset(c,,sizeof c);
memmove(c,a,sizeof c);
memset(a,,sizeof a);
int i,cnt=;
for(i=;i<=n;i++) if(c[i])
{
a[++cnt]=c[i];
}
}
inline void Debug()
{
int i;
for(i=;i<=n;i++) W(a[i]);
puts("");
}
inline bool Solve(int l,int r)
{
if(l==r) return true;
int i,Now=;
bool Flag=;
for(i=l+;i<=r;i++) if(a[i]!=a[i-]) {Flag=; break;}
if(!Flag) return false;
for(i=l;i<=r;i++)
{
if(a[i]>a[Now]) Now=i;
else if(a[i]==a[Now]&&((i<r&&a[i]>a[i+])||(i>l&&a[i]>a[i-]))) Now=i;
}
int cnt=r-l+,Sum=a[Now];
while(cnt>)
{
if(Now>l&&Sum>a[Now-])
{
Sum+=a[Now-];
ans[++*ans]=Now; Fx[*ans]=-;
F5(Now,-);
Now--;
}
else if(Now<r&&Sum>a[Now+])
{
Sum+=a[Now+];
ans[++*ans]=Now; Fx[*ans]=;
F5(Now,);
r--;
}
cnt--;
}
return true;
}
int main()
{
*ans=;
int i,j;
R(n);
for(i=;i<=n;i++) a[i]=read();
R(m);
for(i=;i<=m;i++) R(b[i]);
int Last=;
for(i=;i<=m;i++)
{
int Sum=;
bool Flag=;
for(j=Last;j<=n;j++)
{
Sum+=a[j];
if(Sum>b[i]) break;
if(Sum==b[i])
{
if(!Solve(Last,j)) return puts("NO"),;
Last=i+;
Flag=;
break;
}
}
if(!Flag) return puts("NO"),;
}
if(a[m+]) return puts("NO"),;
puts("YES");
for(i=;i<=*ans;i++)
{
W(ans[i]);
if(Fx[i]==-) putchar('L'); else putchar('R');
puts("");
}
return ;
}
/*
Input
6
1 2 2 2 1 2
2
5 5
Output
YES
2 L
1 R
4 L
3 L Input
5
1 2 3 4 5
1
15
Output
YES
5 L
4 L
3 L
2 L Input
5
1 1 1 3 3
3
2 1 6
Output
NO input
3
2 2 1
1
5
output
YES
2 R
2 L input
5
1 2 3 4 5
1
10
output
NO
*/
codeforces733C的更多相关文章
- codeforces733-C. Epidemic in Monstropolis 贪心加链表
题意 现在有一个怪兽序列a[i],权值大的怪兽可以吃权值小的怪兽,吃完之后权值大的怪兽的权值会变成两者权值的和,相邻的怪兽才能吃 吃完之后,位置合并,队列前移,从左到右重新编号,重复这一过程, 然后给 ...
随机推荐
- js之正则的坑
首先给一个神奇的图: 我的反应,精分吧!一会儿true一会儿false的... 后来发现,把g去掉后就正常了,那这是为什么呢??lastIndex惹得鬼! 正文: lastIndex 全局正则表达是, ...
- 广州.NET微软技术俱乐部微信群各位技术大牛的blog
1. .net core和微服务领域的张善友张队长和马洪喜,证明了.net core和微服务已经在各方面都不比java差2. Xamarin的卢建晖,证明了.net在移动开发领域也是很牛的.3. wi ...
- CSS变量(自定义属性)实践指南
本文翻译自:https://www.sitepoint.com/practical-guide-css-variables-custom-properties/ 转载请注明出处:葡萄城官网,葡萄城为开 ...
- 容器化系列 - Zookeeper启动和配置 on Docker
本文简要说明了如何在Docker容器中启动和配置Zookeeper. 1 准备工作 1.1 下载zookeeper镜像 $ docker pull zookeeper:3.4 1.2 单点模式 安装D ...
- Linux中逻辑卷的快照与还原
有关逻辑卷的其他操作,请看: Linux中对逻辑卷的建立 Linux中对逻辑卷进行扩容与缩小 Linux中对逻辑卷的移除 LVM还有快照的功能,类似windows的系统还原点.其特点: 1.快照卷的容 ...
- linux文件行首行尾添加或替换
sed -i 's/\(^.*\)/http:\/\/www.blutmagie.de\/img\/flags\//g' cc.txt sed -i 's/\($\)/.gif/g' cc.txt
- ServiceStack.Redis连接阿里云redis服务时使用连接池出现的问题
创建连接池 private static PooledRedisClientManager prcm = CreateManager(new string[] { "password@ip: ...
- VS2017离线安装包[百度云盘](收藏了)
*************************************************************************************************** ...
- 初学python列表
首先我定义了一个列表 a = [2,3,3,5,6,7,9] 我想对列表a 的每个值都加一,哈,脑子里顿时闪过一道光 ①首先我想到的是用for 循环来进行加一,即以下代码 a = [2,3,3,5,6 ...
- 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO
完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...