Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37719 Sakuzyh 【BJ】T2 C++ 通过 100 1359 MS 90648 KB 5383 2025-05-02 17:00:47

Tests(30/30):


// Author: Aquizahv #include <bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f #define lnf 0x3f3f3f3f using namespace std; const int N = 1e5 + 5, QQ = 5e5 + 5, M = N + N, MD = M << 2; int n, Q, X[M], posx, Y[M], posy, ans[QQ]; struct node { int x, y, w; bool operator<(const node t) const { return y < t.y; } } a[N], b[N]; vector<pair<int, int> > o; vector<pair<int, int> > upd[M]; struct quest { int l, r, id; }; vector<quest> ask[M][2]; void cdq(int l, int r, int al, int ar, int bl, int br) { if (l == r) return; int mid = (l + r) >> 1; int amid = al, bmid = bl; for (; amid <= ar && a[amid].y <= mid; amid++); for (; bmid <= br && b[bmid].y <= mid; bmid++); amid--, bmid--; // int tmp = o.size(); int amx = 0, bmx = 0; for (int i = al; i <= amid; i++) if (a[i].w > a[amx].w) amx = i; for (int i = bmid + 1; i <= br; i++) if (b[i].w > b[bmx].w) bmx = i; if (bmx) for (int i = al; i <= amid; i++) o.push_back({i, bmx}); if (amx) for (int i = bmid + 1; i <= br; i++) o.push_back({amx, i}); // cout << l << ' '<< r << ' ' << o.size() - tmp << endl; cdq(l, mid, al, amid, bl, bmid); cdq(mid + 1, r, amid + 1, ar, bmid + 1, br); } #define lson (u + u) #define rson (u + u + 1) struct segtree { int mx[MD]; void pushup(int u) { mx[u] = max(mx[lson], mx[rson]); } void update(int u, int l, int r, int it, int x) { if (l == r) { mx[u] = max(mx[u], x); return; } int mid = (l + r) >> 1; if (it <= mid) update(lson, l, mid, it, x); else update(rson, mid + 1, r, it, x); pushup(u); } int query(int u, int l, int r, int L, int R) { if (L <= l && r <= R) return mx[u]; if (R < l || r < L) return -1; int mid = (l + r) >> 1; return max(query(lson, l, mid, L, R), query(rson, mid + 1, r, L, R)); } } t; int main() { cin >> n; for (int i = 1; i <= n; i++) { scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].w); X[++posx] = a[i].x, Y[++posy] = a[i].y; } for (int i = 1; i <= n; i++) { scanf("%d%d%d", &b[i].x, &b[i].y, &b[i].w); X[++posx] = b[i].x, Y[++posy] = b[i].y; } sort(X + 1, X + posx + 1); posx = unique(X + 1, X + posx + 1) - X - 1; sort(Y + 1, Y + posy + 1); posy = unique(Y + 1, Y + posy + 1) - Y - 1; // for (int i = 1; i <= posx; i++) // cout << X[i] << " \n"[i == posx]; // for (int i = 1; i <= posy; i++) // cout << Y[i] << " \n"[i == posy]; for (int i = 1; i <= n; i++) { a[i].x = lower_bound(X + 1, X + posx + 1, a[i].x) - X; a[i].y = lower_bound(Y + 1, Y + posy + 1, a[i].y) - Y; b[i].x = lower_bound(X + 1, X + posx + 1, b[i].x) - X; b[i].y = lower_bound(Y + 1, Y + posy + 1, b[i].y) - Y; } // for (int i = 1; i <= n; i++) // printf("%d%c", a[i].x, " \n"[i == n]); // for (int i = 1; i <= n; i++) // printf("%d%c", b[i].x, " \n"[i == n]); sort(a + 1, a + n + 1), sort(b + 1, b + n + 1); cdq(1, posy, 1, n, 1, n); for (auto i : o) { upd[a[i.first].x].push_back({b[i.second].x, a[i.first].w + b[i.second].w}); // cout << a[i.first].x << ' ' << b[i.second].x << ' ' << a[i.first].w + b[i.second].w << endl; } cin >> Q; int l, r; for (int i = 1; i <= Q; i++) { scanf("%d%d", &l, &r); ask[lower_bound(X + 1, X + posx + 1, l) - X - 1][0].push_back({upper_bound(X + 1, X + posx + 1, r) - X, posx, i}); ask[upper_bound(X + 1, X + posx + 1, l) - X][1].push_back({1, lower_bound(X + 1, X + posx + 1, r) - X - 1, i}); // cout << lower_bound(X + 1, X + posx + 1, l) - X - 1 << ' ' << upper_bound(X + 1, X + posx + 1, l) - X << endl; } memset(t.mx, -1, sizeof(t.mx)); memset(ans, -1, sizeof(ans)); // cout << "ASCENDING MIGHTYYYY!!!" << endl; for (int i = 1; i <= posx; i++) { // cout << i << endl; for (auto j : upd[i]) { // cout << "upd: " << j.first << ' ' << j.second << endl; t.update(1, 1, posx, j.first, j.second); } for (auto j : ask[i][0]) { // cout << "ask: " << j.l << ' ' << j.r << ' ' << j.id << endl; ans[j.id] = t.query(1, 1, posx, j.l, j.r); } } memset(t.mx, -1, sizeof(t.mx)); // cout << "DECENDING 3,2,1" << endl; for (int i = posx; i >= 1; i--) { // cout << i << endl; for (auto j : upd[i]) { // cout << "upd: " << j.first << ' ' << j.second << endl; t.update(1, 1, posx, j.first, j.second); } for (auto j : ask[i][1]) { // cout << "ask: " << j.l << ' ' << j.r << ' ' << j.id << endl; ans[j.id] = max(ans[j.id], t.query(1, 1, posx, j.l, j.r)); // cout << t.query(1, 1, posx,j.l, j.r) << ' ' << ans[j.id] << endl; } } for (int i = 1; i <= Q; i++) printf("%d\n", ans[i]); return 0; }


测评信息: