Codeforces Round #378 (Div. 2)C.Epidemic in Monstropolis(codeforces733c)
来源:互联网 发布:绵阳网店美工招聘 编辑:程序博客网 时间:2024/05/16 06:24
题目链接:
codeforces733c
题意:
给你
数据范围:
题解:
1、我们可以把a序列分成m个连续的块,每个块的值的总和与b对应,对于每个块我们单独处理下,我们可以这个块的最大值开始向两边合并,切存在相邻的数小于它,然后一直合并下去就可以了!!!
2、但这里有几个注意点,每个块不能合并的条件为这个块里所有元素都相等且块的长度不为1、b的总和和a的总和要相等。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<bitset>#include<set>#include<queue>#include<stack>#include<map>#include<cstdlib>#include<cmath>#define PI 2*asin(1.0)#define LL long long#define pb push_back#define pa pair<int,int>#define clr(a,b) memset(a,b,sizeof(a))#define lson lr<<1,l,mid#define rson lr<<1|1,mid+1,r#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)#define key_value ch[ch[root][1]][0]const int MOD = 1000000007;const int N = 500 + 15;const int maxn = 1e5+ 14;const int letter = 130;const int INF = 1e9;const double pi=acos(-1.0);const double eps=1e-8;using namespace std;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int n,m;int a[N],b[N],dis[N],cnt;vector<int>ps;struct node{ int id; char ch;}g[N];bool solve(int l,int r,int val,int p){ if(l==r) return 1; ps.clear(); for(int i=l;i<=r;i++) ps.pb(a[i]); int id=-1,max1=0; for(int i=0;i<ps.size();i++) max1=max(max1,ps[i]); for(int i=0;i<ps.size();i++){ if(i==0&&max1==ps[i]&&ps[i]>ps[i+1]) {id=i;break;} else if(i==ps.size()-1&&max1==ps[i]&&ps[i]>ps[i-1]){id=i;break;} else if(i!=0&&i!=ps.size()-1&&max1==ps[i]&&(ps[i]>ps[i-1]||ps[i]>ps[i+1])){id=i;break;} } if(id==-1) return 0; while(ps.size()>1){ if(id==0){ g[cnt].id=id+p,g[cnt++].ch='R'; ps[id]+=ps[id+1]; ps.erase(ps.begin()+id+1); } else if(id==ps.size()-1) g[cnt].id=id+p,g[cnt++].ch='L',ps[id]+=ps[id-1],ps.erase(ps.begin()+id-1),id--; else { if(ps[id]>ps[id-1]) g[cnt].id=id+p,g[cnt++].ch='L',ps[id]+=ps[id-1],ps.erase(ps.begin()+id-1),id--; else if(ps[id]>ps[id+1])g[cnt].id=id+p,g[cnt++].ch='R',ps[id]+=ps[id+1],ps.erase(ps.begin()+id+1); } } return 1;}int main(){ cnt=0; scanf("%d",&n); LL c=0,d=0; for(int i=1;i<=n;i++) scanf("%d",a+i),c+=1ll*a[i],dis[i]=dis[i-1]+a[i]; scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",b+i),d+=1ll*b[i]; int l=0,gg=1; int flag=1; for(int p=1;p<=n;p++){ if(gg>m) {flag=0;break;} if(dis[p]-dis[l]==b[gg]){ if(!solve(l+1,p,dis[p]-dis[l],gg)){flag=0;break;} l=p; gg++; } else if(dis[p]-dis[l]>b[gg]){flag=0;break;} } if(!flag||c!=d){ puts("NO"); } else { puts("YES"); for(int i=0;i<cnt;i++){ printf("%d %c\n",g[i].id,g[i].ch); } } return 0;}
0 0
- Codeforces Round #378 (Div. 2)C.Epidemic in Monstropolis(codeforces733c)
- 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 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 (贪心模拟)
- codeforces733C Epidemic in Monstropolis
- Codeforces#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 #378C(733.C) Epidemic in Monstropolis
- CodeForces 733 C.Epidemic in Monstropolis(贪心)
- 【Codeforces 733C】 Epidemic in Monstropolis 【贪心】
- 【16.52%】【codeforces 733C】Epidemic in Monstropolis
- Codeforces 733C Epidemic in Monstropolis
- [codeforces] C. Epidemic in Monstropolis 复杂模拟
- Android 5.1.1 源码目录结构
- 【String】String与StringBuffer
- Android 中listView的多个Item复用问题
- MATLAB 中的diag,spdiags函数
- C/C++程序的内存分配(变量存储)
- Codeforces Round #378 (Div. 2)C.Epidemic in Monstropolis(codeforces733c)
- 编译错误和解决方案
- iBeacon的数据包格式
- 关于消息队列的使用(转载)
- label中显示百分号%
- Ajax跨域
- UIPasteboard 的使用方式:(粘贴、复制类的使用方法)
- 动态生成script,切换脚本
- mysql建用户,建库,授权