贴点代码,鞭策一下自己
#include
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;
}