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

Codeforces 733C Epidemic in Monstropolis 构造+思维

2016-11-01 22:34 405 查看
点击打开链接

//b的k个中的第一个若从a[x']开始合并 因为b[1]为第一个,所以a[1~x']必须全部合并完,

//如果sum[1~x']<b[1]则只能继续向右合并&&因为只能和相邻的合并,所以最后b[1]=sum[1~x] 为a的一段前缀和 

//同理后面的b[j]为a[i]的一段连续和 


b[j]满足前缀和时 构造解即可:从一块的最大值开始向相邻的合并,合并时移动编号

#include <iostream>
#include <algorithm>
#include <list>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N= 1e6+20;
ll a
,b
;
vector<ll> v
;//分块
vector<pair<ll,ll> > ans;
//因为只能合并相邻的 剩下的k个中的第一个肯定为1~x的之和
//第二个为x+1~y之和,同理后面的b[j]为a[i]的一段连续和
int main()
{
int n,k;
cin>>n;
ll x=0,y=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
x+=a[i];
}
cin>>k;
int l=1;
bool flag=true;
for(int j=1;j<=k;j++)
{
cin>>b[j];
y+=b[j];
}
if(x!=y)//数量不同肯定无解
{
cout<<"NO"<<endl;
return 0;
}
ll s=0,cnt=1;
for(int i=1;i<=n;i++)
{
v[cnt].push_back(a[i]);
s+=a[i];
if(s>b[cnt])
{
flag=false;
break;
}
if(s==b[cnt])
{
s=0;
cnt++;
}
}

if(!flag)
{
cout<<"NO"<<endl;
return 0;
}
else
{
for(int i=1;i<=k;i++)//构造解 ://最大值如果和相邻合并后,大于该块所有值,扫一遍即可
{
if(v[i].size()==1)
continue;

bool flag=false;
ll t=v[i][0];
ll mx=t;
for(int j=1;j<v[i].size();j++)
{
if(t!=v[i][j])//该块全部相同无法合并
{
flag=true;//
}
mx=max(mx,v[i][j]);//找到最值开始合并
}
if(!flag)
{
cout<<"NO"<<endl;
return 0;
}

int pos,lr=0;//标记最大值旁边是否有比他小的数
for(int j=0;j<v[i].size()-1;j++)//判定最值能否和相邻的合并
{
if(v[i][j]==mx&&v[i][j+1]<mx)
{
lr=1;
pos=j;
break;
}
}
if(!lr)
{
for(int j=v[i].size()-1;j>0;j--)
{
if(v[i][j]==mx&&v[i][j-1]<mx)
{
lr=-1;
pos=j;
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));//向右移动
}
}

}
cout<<"YES"<<endl;
for(int i=0;i<ans.size();i++)
{
cout<<ans[i].first<<" ";
if(ans[i].second==-1)
cout<<"L"<<endl;
else
cout<<"R"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: