题目链接: 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;
}