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],权值大的怪兽可以吃权值小的怪兽,吃完之后权值大的怪兽的权值会变成两者权值的和,相邻的怪兽才能吃 吃完之后,位置合并,队列前移,从左到右重新编号,重复这一过程, 然后给 ...
随机推荐
- python爬虫+数据可视化项目(关注、持续更新)
python爬虫+数据可视化项目(一) 爬取目标:中国天气网(起始url:http://www.weather.com.cn/textFC/hb.shtml#) 爬取内容:全国实时温度最低的十个城市气 ...
- vue2.x 时间范围 date range timepicker。只在项目中使用elementUI的date-picker
elementUI官方案例:http://element.eleme.io/#/zh-CN/component/date-picker (1)效果图: (2)安装和引入 npm i element-u ...
- 深海中的STL—nth_element
如果让你求区间第\(k\)大,你会怎么做呢? 主席树?确实是个不错的选择(不过像我这种垃圾还是乖乖打暴力吧) 在c++的stl库中,提供了nth_element这样一个函数 它的用法是nth_elem ...
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
- wepy框架自定义组件编译报错not Found File XXX.wxss
今天在自己写wepy框架组件的时候编译后报错not Found File XXX.wxss 我去,当时我很难受啊,调用组件时结构和逻辑都正常,一写样式就原地爆炸 解决之路:1.先打开编译后的dist文 ...
- border,padding,margin盒模型理解
安静的敲着键盘,已势不可挡的姿势逼近php,我想我是一个幸福的人,未来不可期,做好现在,偶尔写着自己能看懂的API,慢慢悠悠的回味一下前端基础知识. 本文盒模型理解. <!DOCTYPE htm ...
- OpenUDID 和 IDFA 比较
iOS标识符 现今来比较下,不同情况下两种标识符的变化情况.以下试验,每种标识符均分为存于Keychain和未存于Keychain的两种情况做比较. 广告标识符(IDFA-identifierForI ...
- Android ContenObserver 监听联系人数据变化
一.知识介绍 1.ContentProvider是内容提供者 ContentResolver是内容解决者(对内容提供的数据进行操作) ContentObserver是内容观察者(观察内容提供者提供的数 ...
- 【笔记】两个根因分析方法:5WHY&10WHY
什么是问题根因分析 根本原因分析(root cause analysis):通过调查和分析问题哪里出错.为什么出错,寻求防止差错事故再次发生的必要措施,从而提高服务安全和质量. 根因分析目标 问题(发 ...
- laravel部署创建新项目 助记
打开进入homestead虚拟机,并进入code文件夹 cd ~/homestead && vagrant up && vagrant ssh cd ~/Code 进行 ...