codeforces B - Collecting Game

分析

  • a i a_i ai 小的一定对 a n s i ans_i ansi 有贡献(应该加上)。加上之后 s c o r e score score 变大,在 s c o r e score score 变大的过程中可能会有更多的 a j a_j aj 小于 s c o r e score score
  • 很容易想到排序,排序之后当前 s c o r e score score 就是 ∑ j = 1 i a j \sum\limits_{j = 1}^ia_j j=1iaj ,设 d p i dp_i dpi 表示当前 i i i 往右能覆盖的最多个数。双指针找到最大范围 r r r ,那么 a n s i = r − i + d p i ans_i = r - i + dp_i ansi=ri+dpi

Think Twice, Code Once

signed main() {
 
    int T = 1;
    T = read();
    while (T--) {
        int n = read();
        vector<pii> a(n + 1);
        int sum = 0;
        for (int i = 1; i <= n; ++i) {
            a[i].first = read(), a[i].second = i;
            sum += a[i].first;
        }
        sort(a.begin() + 1, a.end());
        int r = n;
        vector<int> dp(n + 1), ans(n + 1);
        ans[a[n].second] = n - 1;
        for (int i = n - 1; i >= 1; --i) {
            sum -= a[i + 1].first;
            while (a[r].first > sum) --r;
            dp[i] += r - i + dp[r];
            ans[a[i].second] = i - 1 + dp[i];
        }
        for (int i = 1; i <= n; ++i) writesp(ans[i]);
        puts("");
    }
    return 0;
}
  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_sealy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值