Epidemic in Monstropolis

CodeForces - 733C

有n条鱼排成一列,第i条鱼大小为ai,根据自然界的生存法则,相邻的两只鱼中,较大的鱼可以吃掉较小的鱼,如果两条鱼大小相等,则它们无法吃掉对方。当一条鱼i吃掉另一条鱼j后,它的体积会变成ai+aj,即获取小鱼的大小。小鱼因为消失故会在序列中被抹去。

例如,对于序列 [1, 2, 2, 2, 1, 2] ,有如下情况

  1. 第一条鱼无法吃掉任何一条鱼因为a1 = 1
  2. 第二条鱼无法吃掉第三条鱼因为 a2 = 2且 a3 = 2;
  3. 第二条鱼无法吃掉第五条鱼因为它们不相邻;
  4. 第二条鱼可以吃掉第一条鱼,吃掉以后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的更多相关文章

  1. codeforces733-C. Epidemic in Monstropolis 贪心加链表

    题意 现在有一个怪兽序列a[i],权值大的怪兽可以吃权值小的怪兽,吃完之后权值大的怪兽的权值会变成两者权值的和,相邻的怪兽才能吃 吃完之后,位置合并,队列前移,从左到右重新编号,重复这一过程, 然后给 ...

随机推荐

  1. CSS变量(自定义属性)实践指南

    本文翻译自:https://www.sitepoint.com/practical-guide-css-variables-custom-properties/ 转载请注明出处:葡萄城官网,葡萄城为开 ...

  2. Lansat8大气校正USGS-EROS项目espa-surface-reflectance中的LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本的使用(三)

    Landsat8大气校正程序LaSRC是目前最好的,使用方式也够傻瓜,输入文件输出结果. 但有一个限制,就是程序需要预先下载好的MODIS辅助文件来确定水汽.压强等大气参数. 如果待大气校正的land ...

  3. Android开发,关于如何在应用间共享SharedPreference

    开发一个应用,需要用到两个应用A和B之间共享数据的问题,这个数据是个单一的数据,所以就想用SharedPrefernce来进行保存. 使用网上的各种应用间的共享代码,B是读取A的数据,所以代码为: C ...

  4. stereoscopic 3D

    色分(Anaglyph)模式:典型的如红蓝立体,是利用红镜片只允许红光通过,蓝镜片只允许蓝光通过的原理,将两幅视差的图片(一张红色.一张蓝色)叠加构成一张立体图片 由于红蓝立体去掉了绿色分量,会导致最 ...

  5. MySQL中Identifier Case Sensitivity

    在MySQL当中,有可能遇到表名大小写敏感的问题.其实这个跟平台(操作系统)有关,也跟系统变量lower_case_table_names有关系.下面总结一下,有兴趣可以查看官方文档"Ide ...

  6. c/c++ 网络编程 使用getaddrinfo的单纯UDP 通信

    网络编程 使用getaddrinfo的单纯UDP 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> ...

  7. jsp 简单下载

    <%@ page language="java" import="java.util.*" contentType="text/html;cha ...

  8. MFC桌面电子时钟的设计与实现

    目录 核心技术 需求分析 程序设计 程序展示 (一)核心技术 MFC(Micosoft Foundation Class Libay,微基础类库)是微基于Windows平台下的C++类库集合,MFC包 ...

  9. LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

    这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...

  10. Python开发【socket篇】解决粘包

    客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8 ...