2023.11.4第二次算法训练赛(ABC327)

A题

在这里插入图片描述

B题

在这里插入图片描述

C题

在这里插入图片描述

D题

在这里插入图片描述

E题

在这里插入图片描述

F题

在这里插入图片描述

贴点代码,鞭策一下自己

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
#define  len(x) ((int)((x).size()))
#define PQ priority_queue
#define all(x) (x).begin(),(x).end()
#define sep(x) setprecision((x))
const int mod = 998244353;
// const int mod=(int)(1e9+7);
// const int inf = 0x3f3f3f3f;
// const ll inf = (ll)1e15;
const int maxN = 2e5;
const ll inf = 2e18;


template<class Info, class Tag>
struct LazySegmentTree {
    int n;
    vector<Info> info;
    vector<Tag> tag;
    LazySegmentTree(int n) : n(n), info(4 * n), tag(4 * n) {}
    template <typename T>
    LazySegmentTree(vector<T> init) : LazySegmentTree(init.size()) {
        auto build = [&](auto build, int id, int l, int r) -> void {
            if (r == l) {
                info[id] = init[l];
                return;
            }
            int m = l + r >> 1;
            build(build, id << 1, l, m);
            build(build, id << 1 | 1, m + 1, r);
            pull(id);
        };
        build(build, 1, 0, n - 1);
    }
    void pull(int id) {
        info[id] = info[id << 1] + info[id << 1 | 1];
    }
    void apply(int id, const Tag &v) {
        info[id] += v;
        tag[id] += v;
    }
    void push(int id) {
        apply(id << 1, tag[id]);
        apply(id << 1 | 1, tag[id]);
        tag[id] = Tag();
    }
    void modify(int id, int l, int r, int p, const Info &v) {
        if (r == l) {
            info[id] = v;
            return;
        }
        int m = l + r >> 1;
        push(id);
        if (p <= m) {
            modify(id << 1, l, m, p, v);
        } else {
            modify(id << 1 | 1, m + 1, r, p, v);
        }
        pull(id);
    }
    void modify(int p, const Info &v) {
        modify(1, 0, n - 1, p, v);
    }
    Info rangeQuery(int id, int l, int r, int ql, int qr) {
        if (qr < l || r < ql) {
            return Info();
        }
        if (ql <= l && r <= qr) {
            return info[id];
        }
        int m = l + r >> 1;
        push(id);
        return rangeQuery(id << 1, l, m, ql, qr) + rangeQuery(id << 1 | 1, m + 1, r, ql, qr);
    }
    Info rangeQuery(int ql, int qr) {
        return rangeQuery(1, 0, n - 1, ql, qr);
    }
    void rangeApply(int id, int l, int r, int ql, int qr, const Tag &v) {
        if (qr < l || r < ql) {
            return;
        }
        if (ql <= l && r <= qr) {
            apply(id, v);
            return;
        }
        int m = l + r >> 1;
        push(id);
        rangeApply(id << 1, l, m, ql, qr, v);
        rangeApply(id << 1 | 1, m + 1, r, ql, qr, v);
        pull(id);
    }
    void rangeApply(int ql, int qr, const Tag &v) {
        return rangeApply(1, 0, n - 1, ql, qr, v);
    }
};

// 相当于lazy数据,注意lazy初始化
struct Tag {
    int add = 0;

};

//lazy数据的更新
Tag& operator+=(Tag &a, Tag b) {
    a.add += b.add;
    return a;
}

//存放节点数据,注意初始化
struct Info {
    int s = 0;
};
// 相当于两个区间的合并
Info operator+(Info a, Info b) {
    Info ans;
    ans.s = max(a.s, b.s);
    return ans;
}
// 相当于pushdown操作,将此时的lazy数据进行更新
Info& operator+=(Info &a, Tag b) {
    a.s += b.add;
    return a;
}
void solve() {

    int N, D, W;
    cin >> N >> D >> W;
    vector<vector<pair<int, int>>> a(maxN);
    for (int i = 0; i < N; i++) {
        int s, x;
        cin >> s >> x;
        s--;
        x--;
        a[s].push_back({x, 1});
        if (s + D < maxN) {
            a[s + D].push_back({x, -1});
        }
    }
    int ans = 0;
    LazySegmentTree<Info, Tag> seg(maxN);
    for (int i = 0; i < maxN; i++) {
        for (auto [x, y] : a[i]) {
            seg.rangeApply(x, min(maxN - 1, x + W - 1), {y});
        }
        ans = max(ans, seg.rangeQuery(0, maxN - 1).s);
    }
    cout << ans << endl;

}
int main () {
    cin.tie(0);
    ios::sync_with_stdio(false);


    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

leisure-pp

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

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

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

打赏作者

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

抵扣说明:

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

余额充值