結果
| 問題 |
No.3214 small square
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-25 22:21:14 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,527 bytes |
| コンパイル時間 | 1,903 ms |
| コンパイル使用メモリ | 214,700 KB |
| 実行使用メモリ | 21,932 KB |
| 最終ジャッジ日時 | 2025-07-25 22:21:23 |
| 合計ジャッジ時間 | 8,635 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 WA * 6 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const int N = 200005;
const int INF = 0x3f3f3f3f;
#define int long long
struct SegTree {
int n;
struct Node {
ll mx, tag;
};
vector<Node> st;
SegTree(int _n) : n(_n), st(4 * n + 4, {0, 0}) {}
void gx(int u, ll v) {
st[u].mx += v;
st[u].tag += v;
}
void pushdown(int u) {
if (!st[u].tag) return;
gx(u << 1, st[u].tag);
gx(u << 1 | 1, st[u].tag);
st[u].tag = 0;
}
void pushup(int u) {
st[u].mx = max(st[u << 1].mx, st[u << 1 | 1].mx);
}
void upd(int u, int l, int r, int x, int y, ll v) {
if (x <= l && r <= y) {
gx(u, v);
return;
}
int mid = l + r >> 1;
pushdown(u);
if (x <= mid) upd(u << 1, l, mid, x, y, v);
if (y > mid) upd(u << 1 | 1, mid + 1, r, x, y, v);
pushup(u);
}
void update(int L, int R, ll v) {
if (L > R) return;
upd(1, 0, n - 1, L, R, v);
}
};
struct point {
ll x, y, v;
};
struct Qode {
ll x;
bool ok;
int L, R;
ll d;
};
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
ll A;
cin >> n >> A;
vector<point> pts(n);
vector<ll> vy;
vy.reserve(n);
for (int i = 0; i < n; i++) {
cin >> pts[i].x >> pts[i].y >> pts[i].v;
vy.push_back(pts[i].y);
}
sort(vy.begin(), vy.end());
vy.erase(unique(vy.begin(), vy.end()), vy.end());
int tot = (int)vy.size();
vector<Qode> ev;
for (auto &p : pts) {
int yi = lower_bound(vy.begin(), vy.end(), p.y) - vy.begin();
ll L = p.y - A;
int lo = lower_bound(vy.begin(), vy.end(), L) - vy.begin();
int R = yi;
ev.push_back({p.x - A, 1, lo, R, p.v});
ev.push_back({p.x, 0, lo, R, -p.v});
}
sort(ev.begin(), ev.end(), [&](auto &x, auto &y) { return x.x < y.x; });
SegTree st(tot);
ll ans = 0;
int i = 0;
while (i < (int)ev.size()) {
ll curx = ev[i].x;
while (i < (int)ev.size() && ev[i].x == curx && ev[i].ok) {
st.update(ev[i].L, ev[i].R, ev[i].d);
i++;
}
ans = max(ans, st.st[1].mx);
while (i < (int)ev.size() && ev[i].x == curx && !ev[i].ok) {
st.update(ev[i].L, ev[i].R, ev[i].d);
i++;
}
ans = max(ans, st.st[1].mx);
}
cout << max(ans, 0ll) << "\n";
return 0;
}