C. Epidemic in Monstropolis(模拟,细节)
发布日期:2021-06-30 10:18:12 浏览次数:2 分类:技术文章

本文共 1539 字,大约阅读时间需要 5 分钟。

很不好写的模拟

首 先 把 区 间 分 成 若 干 个 小 区 间 , 每 个 小 区 间 相 加 等 于 对 应 的 b i 首先把区间分成若干个小区间,每个小区间相加等于对应的b_i ,bi

那 么 对 于 每 个 小 区 间 , 我 们 挑 一 个 最 大 的 怪 兽 开 始 吃 那么对于每个小区间,我们挑一个最大的怪兽开始吃 ,

但是注意这个怪兽一定要能吃左或右边的怪兽才行

然 后 就 是 下 标 问 题 了 然后就是下标问题了

前 面 如 果 有 i 个 小 区 间 , 那 么 前 面 就 只 剩 下 i 只 怪 兽 前面如果有i个小区间,那么前面就只剩下i只怪兽 i,i

如 果 当 前 怪 兽 向 左 边 吃 , 下 标 还 要 减 去 1 如果当前怪兽向左边吃,下标还要减去1 ,1

如 果 向 右 边 吃 , 下 标 不 变 如果向右边吃,下标不变 ,

#include 
using namespace std;const int maxn=2e5+10;int n,m,t,a[maxn],b[maxn];void over(){ cout << "NO"; exit(0);}struct p{ int l,r,v;}s[maxn];int main(){ cin >> n ; for(int i=1;i<=n;i++) cin >> a[i]; cin >> m; for(int i=1;i<=m;i++) cin >> b[i]; int temp=0,top=1,maxx=0; for(int i=1;i<=n;i++) { temp+=a[i]; maxx=max(maxx,a[i]); if( temp>b[top] ) over(); else if( temp==b[top] ) { temp=0,top++; ++t; s[t].l=s[t-1].r+1,s[t].r=i; s[t].v=maxx,maxx=0; int shu=0,len=s[t].r-s[t].l+1; for(int j=s[t].l;j<=s[t].r;j++) if(a[j]==s[t].v) shu++; if(shu==len&&len!=1) over(); } } if( top!=m+1 ) over(); int he=0; cout<<"YES"<
a[j+1]||a[j]>a[j-1] ) num=j; if( num ) break; } int ll=s[i].l,rr=s[i].r; if( a[ ll ]>a[ll+1]&&a[ll]==maxx ) num=ll; else if( a[rr]>a[rr-1]&&a[rr]==maxx ) num=rr; int l=num-1,r=num+1,x=a[num]; int zuo=0,you=0; if(s[i].r-s[i].l+1!=1) { while(1) { if( x>a[l] && l>=s[i].l) { x+=a[l--]; cout<
<<" L"<
s[i].r) break; } } he+=(s[i].r-s[i].l); }}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/107284281 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C. Journey(拓扑dp)
下一篇:D. Winter Is Coming(连通块贪心合并)

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月30日 02时37分33秒