题解:CF1793E Velepin and Marketing
原题题意等价于
继续贪心地想,对于满足一段前缀合法如何使得分组数量最大。要满足前缀合法就可能往后取,由于后面的数字不用考虑贡献,没有被选中的那些人都可以每人分一组,后面多保留一个一定不劣与前面多保留一个的贡献,所以贪心策略就转化成了考虑保留尽量多的后面的数的情况下,最小化前面数字分组数。我们记
得到
code:
const int N=3e5+5;
int n,m,a[N],f[N],g[N],ans[N],q,cnt[N];
inline void SOLVE(){
n=rd();for(int i=1;i<=n;i++)++cnt[rd()];
for(int i=1;i<=n;i++)while(cnt[i])cnt[i]--,a[++m]=i;
for(int i=1;i<=n;i++){
if(a[i]<=i)f[i]=g[i-a[i]]+1+n-i,g[i]=g[i-a[i]]+1;
else f[i]=n-a[i]+1,g[i]=0;cmx(g[i],g[i-1]);
}for(int i=1,j=n-a[1]+1;i<=n;i++){
if(f[i]==f[i+1])continue;
while(j>f[i+1])ans[j]=i,j--;
}q=rd();while(q--){int x=rd();printf("%lld\n",ans[x]);}
return ;
}