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;
}
//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;
}
相关文章推荐
- codeforces 733C Epidemic in Monstropolis 贪心
- CodeForces 733C Epidemic in Monstropolis
- CodeForces - 733C Epidemic in Monstropolis (模拟乱搞)
- 【Codeforces 733C】 Epidemic in Monstropolis 【贪心】
- Codeforces 733C Epidemic in Monstropolis
- 【16.52%】【codeforces 733C】Epidemic in Monstropolis
- CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法
- CodeForces 733C - Epidemic in Monstropolis
- [codeforces] C. Epidemic in Monstropolis 复杂模拟
- CodeForces 733 C.Epidemic in Monstropolis(贪心)
- 【codeforces 733 C】【模拟】C. Epidemic in Monstropolis【给你n个数,再给你k个数,问你a序列能否通过一定规则合并变成b序列】
- Codeforces Round #378 (Div. 2)C. Epidemic in Monstropolis
- Codeforces Round #378 (Div. 2) C. Epidemic in Monstropolis 模拟
- Codeforces Round #378 (Div. 2) C. Epidemic in Monstropolis(模拟)
- Codeforces Round #378 (Div. 2) C Epidemic in Monstropolis
- codeforces-733C-greedy
- Codeforces Round #378 (Div. 2) -- C. Epidemic in Monstropolis (贪心模拟)
- Epidemic in Monstropolis
- Codeforces Round #378 (Div. 2)-C. Epidemic in Monstropolis
- Codeforces#378 div.2 C. Epidemic in Monstropolis