D - Coming of Age Celebration (前缀+差分)

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


posted @ 2025-01-12 10:34  Marinaco  阅读(71)  评论(0)    收藏  举报
//雪花飘落效果