贴一份G的的代码 够清爽

// 线段树模板 区间加
void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) cin >> a[i];
    auto b = a;
    std::sort(b.begin(), b.end());
    SegTree seg(n);
    for (int i = 1; i <= n; i++)
    {
        int x = b.end() - std::upper_bound(b.begin(), b.end(), a[i]);
        seg.modify(1, 1, n, i, Info(x));
        //        cout << x << " \n"[i == n];
    }
    vector<PII > c(n + 1);
    for (int i = 1; i <= n; i++) c[i] = {a[i], i};
    std::sort(c.begin() + 1, c.end());
    int q;
    cin >> q;
    vector<PII > ask(q);
    for (int i = 0; i < q; i++)
    {
        int x;
        cin >> x, ask[i] = {x, i};
    }
    ranges::sort(ask, greater());
    vector<int> ans(q);
    for (auto [x, id]: ask)
    {
        while (c.size() and c.back().first > x)
        {
            int i = c.back().second;
            if (i != n) seg.rangeApply(1, 1, n, i + 1, n, Tag(1));
            c.pop_back();
        }
        ans[id] = seg.info[1].val;
    }
    for (int i = 0; i < q; i++) cout << ans[i] << "\n";
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务