社区讨论

WA #9 细节求调 能试的都试了 QAQ

P1502窗口的星星参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo7iwx32
此快照首次捕获于
2023/10/27 02:34
2 年前
此快照最后确认于
2023/11/05 08:31
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
template <typename T1>
ostream& info_base(ostream& cout, T1 const& x)
{
    cout << x << "]" << endl;
    return cout;
}
template <typename T1, typename... T2>
ostream const& info_base(ostream& cout, T1 const& x, T2 const&... arg)
{
    cout << x << ", ";
    info_base(cout, arg...);
    return cout;
}
template <typename T1, typename... T2>
ostream const& info(ostream& cout, T1 const& x, T2 const&... arg)
{
    cout << "[";
    info_base(cout, x, arg...);
    return cout;
}
template <typename T1, typename... T2>
ostream const& info(ostream& cout, T1 const& x)
{
    cout << "[" << x << "]" << endl;
    return cout;
}

struct line {
    long long x, l, r, val;
};
line d[80004];

struct node {
    long long l, r, val;
};
long long lazy_tag[80004];
node tree[80004];

long long s[80004];

long long t;
long long n, w, h, ans = 0;

void push_up(long long root)
{
    tree[root].val = max(tree[root << 1].val, tree[root << 1 | 1].val);
}

void build_tree(long long root, long long l, long long r)
{
    tree[root].l = s[l];
    tree[root].r = s[r];
    if (r - l > 1) {
        long long mid = (l + r) >> 1;
        build_tree(root << 1, l, mid);
        build_tree(root << 1 | 1, mid, r);
    }
}

void push_down(long long root)
{
    tree[root << 1].val += lazy_tag[root];
    tree[root << 1 | 1].val += lazy_tag[root];
    lazy_tag[root << 1] += lazy_tag[root];
    lazy_tag[root << 1 | 1] += lazy_tag[root];
    lazy_tag[root] = 0;
}

void update_tree(long long root, long long ll, long long rr, long long val)
{
    long long l = tree[root].l;
    long long r = tree[root].r;
    if (l >= rr || r <= ll)
        return;
    // info(cout, root, l, r, ll, rr, val);
    if (ll <= l && r <= rr) {
        tree[root].val += val;
        lazy_tag[root] += val;
        return;
    }
    long long mid = (l + r) >> 1;
    push_down(root);
    if (ll < tree[root << 1].r) {
        // info(cout, "L");
        update_tree(root << 1, ll, rr, val);
    }
    if (rr > tree[root << 1 | 1].l) {
        // info(cout, "R");
        update_tree(root << 1 | 1, ll, rr, val);
    }
    push_up(root);
}

int cnt = 0;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> t;
    while (t--) {
        cin >> n >> w >> h;
        for (long long i = 1; i <= n; i++) {
            long long x, y, l;
            cin >> x >> y >> l;
            d[i].x = x;
            d[i].l = y;
            d[i].r = y + h - 1;
            d[i].val = l;
            d[i + n].x = x + w - 1;
            d[i + n].l = y;
            d[i + n].r = y + h - 1;
            d[i + n].val = -l;
            s[i] = y;
            s[i + n] = y + h - 1;
        }
        cnt = 0;
        // info(cout, "pass");
        sort(s + 1, s + 1 + n + n);
        cnt = unique(s + 1, s + 1 + n + n) - s - 1;
        // info(cout, "pass");
        sort(d + 1, d + 1 + n + n, [](line x, line y) {
            return (x.x == y.x ? x.val > y.val : x.x < y.x);
        });
        // info(cout, "pass");
        memset(lazy_tag, 0, sizeof(lazy_tag));
        memset(tree, 0, sizeof(tree));
        ans = 0;
        build_tree(1, 1, cnt);
        // info(cout, "pass");
        for (long long i = 1; i <= n + n; i++) {
            update_tree(1, d[i].l, d[i].r, d[i].val);
            ans = max(ans, tree[1].val);
            // info(cout, tree[1].val);
        }
        cout << ans << endl;
    }
}
求求啦

回复

0 条回复,欢迎继续交流。

正在加载回复...