您的位置:首页 > 运维架构

Codeforces 733C Epidemic in Monstropolis

2016-11-01 19:32 471 查看
思路:

先把你给个队列分成k段,每段的和与最终的队列一一对应,然后找到每段的最大值(且左或右右有比他小的),可以发现,先叫他吃了旁边比他小的,然后就一定是最大的了,这样一直叫这个怪兽吃旁边的就好了。

大致说下为什么可以这样:

首先要能让那一段最终变成一只怪兽,每个ai都一样肯定是不行的,所以一定有一个最大以及旁边有个比他小的。

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
typedef long long LL;
typedef unsigned long long ULL;

const int maxn=510;
vector<LL>v[maxn];
vector<pair<int,int> >ans;
LL a[maxn],b[maxn];
int n,k;

int main()
{
LL x,y;
x=y=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%I64d",a+i);
x+=a[i];
}
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%I64d",b+i);
y+=b[i];
}
if(x!=y){
printf("NO\n");
return 0;
}
int cnt=1;
LL sum=0;
for(int i=1;i<=n;i++){
v[cnt].push_back(a[i]);
sum+=a[i];
if(sum==b[cnt]){
cnt++;
sum=0;
}
else if(sum>b[cnt]){
printf("NO\n");
return 0;
}
}
if(cnt!=k+1){
printf("NO\n");
return 0;
}
for(int i=1;i<=k;i++){
if(v[i].size()==1)continue ;
LL t=v[i][0];
LL mx=t;
int ok=0;
for(int j=1;j<v[i].size();j++){
if(t!=v[i][j]){
ok=1;
}
mx=max(mx,v[i][j]);
}
if(!ok){
printf("NO\n");
return 0;
}
int pos=-1;
int lr=0;
for(int j=0;j<v[i].size()-1;j++){
if(v[i][j]==mx&&v[i][j+1]!=mx){
pos=j;
lr=1;
break;
}
}
if(!lr){
for(int j=v[i].size()-1;j>0;j--){
if(v[i][j]==mx&&v[i][j-1]!=mx){
pos=j;
lr=-1;
break;
}
}
}
if(lr==1){
for(int j=pos+1;j<v[i].size();j++){
ans.push_back(make_pair(pos+i,1));
}
for(int j=pos-1;j>=0;j--){
ans.push_back(make_pair(j+i+1,-1));
}
}
else {
for(int j=pos-1;j>=0;j--){
ans.push_back(make_pair(j+i+1,-1));
}
for(int j=pos+1;j<v[i].size();j++){
ans.push_back(make_pair(i,1));
}
}
}
printf("YES\n");
for(int i=0;i<ans.size();i++){
printf("%d ",ans[i].first);
if(ans[i].second==-1){
printf("L\n");
}
else {
printf("R\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: