其 实 开 始 想 了 很 久 其实开始想了很久

突 然 看 到 每 个 人 的 时 间 最 大 才 100 ! ! ! 突然看到每个人的时间最大才100!!! 100!!!

这 里 强 调 一 点 , 时 间 本 可 以 是 1 e 5 甚 至 更 大 这里强调一点,时间本可以是1e5甚至更大 ,1e5

但 是 才 100 , 说 明 这 是 个 突 破 口 ! ! 我 们 直 接 开 数 组 把 每 种 时 间 存 有 多 少 个 但是才100,说明这是个突破口!!我们直接开数组把每种时间存有多少个 100!!

然 后 新 加 入 一 个 人 , 就 可 以 遍 历 数 组 从 100 到 1 , 计 算 要 多 少 人 失 败 节 省 时 间 然后新加入一个人,就可以遍历数组从100到1,计算要多少人失败节省时间 ,1001,

#include <bits/stdc++.h>
using namespace std;
int n,m,a[200009],vis[101];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	int temp=0;
	for(int i=1;i<=n;i++)
	{
		temp+=a[i];
		if(temp<=m)	printf("0 ");
		else
		{
			int num=0,now=temp-m;//需要腾出这么多
			for(int i=100;i>=1;i--)
			{
				if(vis[i]==0)	continue;
				if(vis[i]*i<now)	num+=vis[i],now-=vis[i]*i;
				else
				{
					num+=now/i+1;
					if(now%i==0)	num--;
					break;	
				}	
			} 
			printf("%d ",num);
		}
		vis[a[i]]++;
	}
}