题目链接: https://atcoder.jp/contests/abc388/tasks/abc388_d
题意:
一共有n个外星人,每当有一个外星人成年后,成年的外星人就要给他一块钱(如果没钱就不给),返回操作后数组
思路:
模拟一下,可以把 数组前面 已经成年的外星人 对下一个刚好要成年的外星人 的钱数贡献 记作前缀信息s,随着数组的遍历(成年外星人每次多一个),s每次++。
如果一个成年外星人兜里钱足够的多,那么他对后面所有的外星人的钱数贡献都是1,是不变的
否则,这个外星人就只能为他后面一部分(直到下标来到 i+1 +钱数)的外星人做出1的贡献,所以可以把位置信息记录下来,等到i碰到了这个位置,说明这个成年外星人对后面未成年外星人钱数做不了贡献了,将s--
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
const int maxn=5e5+5;
int arr[maxn];
int suf[maxn];
int s=0;
signed main()
{
ios::sync_with_stdio(false),cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>arr[i];
for(int i=1;i<=n;i++)
{
s+=suf[i];
arr[i]+=s;
s++;
if(arr[i]>=n-i)
{
arr[i]-=(n-i);
}else{
suf[i+arr[i]+1]--;
arr[i]=0;
}
cout<<arr[i]<<' ';
}
return 0;
}
标签:钱数,arr,成年,int,Age,外星人,maxn,Coming,Celebration
From: https://www.cnblogs.com/benscode/p/18666760