84ptsTLE最后4个点,求卡常
查看原帖
84ptsTLE最后4个点,求卡常
987524
lhy_cpp楼主2025/7/25 01:01
#include <bits/stdc++.h>
#define int long long
//#define maxn 300005
using namespace std;
const int maxn=300005;
char buf[1 << 20], *p1, *p2;
#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)
long long maxx(int a,int b){
    return a>b?a:b;
}
long long rd()
{
    int x = 0, f = 1;
    char c = gc();
    while (!isdigit(c))
    {
        if (c == '-')
            f = -1;
        c = gc();
    }
    while (isdigit(c))
        x = x * 10 + (c ^ 48), c = gc();
    return x * f;
}

struct node
{
    int l, r, val;
    friend bool operator<(node a, node b)
    {
        return a.r < b.r;
    }
} a[maxn];

struct seg
{
    int l, r, val, tag;
} w[4 * maxn];
int n, m, t[maxn], cnt, k, d;

bool in(int l1, int r1, int l2, int r2)
{
    return (l1 >= l2 && r1 <= r2);
}
bool out(int l1, int r1, int l2, int r2)
{
    return (l1 > r2 || l2 > r1);
}
inline void pushup(int u)
{
    w[u].val = maxx(w[u <<1].val, w[u <<1 |1].val);
}
inline void maketag(int u, int k)
{
    w[u].val += k;
    w[u].tag += k;
}
inline void pushdown(int u)
{
    // int mid = (l + r) / 2;
    if (!w[u].tag)
        return;
    maketag(u <<1, w[u].tag);
    maketag(u <<1 |1, w[u].tag);
    w[u].tag = 0;
}
inline void build(int u, int l, int r)
{
    w[u] = {l, r, 0, 0};
    if (l == r)
    {
        return;
    }
    else
    {
        int mid = (l + r) >>1;
        build(u <<1, l, mid);
        build(u <<1 |1, mid +1, r);
        // pushup(u);
    }
}
inline void add(int u, int L, int R, int k)
{
    if (in(w[u].l, w[u].r, L, R))
    {
        maketag(u, k);
    }
    else
    {
        if (!out(w[u].l, w[u].r, L, R))
        {
            pushdown(u);
            add(u <<1, L, R, k);
            add(u <<1 |1, L, R, k);
            pushup(u);
        }
    }
}
inline long long query(int u, int L, int R)
{
    if (in(w[u].l, w[u].r, L, R))
    {
        return w[u].val;
    }
    else
    {
        if (!out(w[u].l, w[u].r, L, R))
        {
            pushdown(u);
            return maxx(query(u <<1, L, R), query(u <<1 |1, L, R));
        }
        else
        {
            return 0;
        }
    }
}
inline long long gt(int x)
{
    return lower_bound(t + 1, t + cnt + 1, x) - t;
}
inline void work()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);
    n=rd();m=rd();k=rd();d=rd();

    cnt = 0;
    for (int i = 1; i <= m; i++)
    {
        int x, y, val;
        x=rd();y=rd();val=rd();
        a[i] = node{x - y, x, val};
        t[++cnt] = a[i].l;
        t[++cnt] = a[i].r;
    }
    sort(t + 1, t + cnt + 1);
    cnt = unique(t + 1, t + cnt + 1) - t - 1;
    build(1, 0, cnt - 1);
    for (int i = 1; i <= m; i++)
    {
        a[i].l = gt(a[i].l);
        a[i].r = gt(a[i].r);
    }
    sort(a + 1, a + m + 1);
    int ans = 0;
    int q = 1;
    for (int i = 1; i <= cnt; i++)
    {
        add(1, 0, i - 1, -1 * d * (t[i] - t[i - 1]));

        while (q <= m && a[q].r == i)
        {
            add(1, 0, a[q].l, a[q].val);
            q++;
        }
        ans = maxx(ans, query(1, gt(t[i] - k), i - 1));
        if (i + 1 <= cnt)
        {
            add(1, i + 1, i + 1, ans);
        }
    }
    cout << ans << "\n";
}
signed main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);
    int cas, T;
    cas=rd();
    T=rd();
    while (T--)
    {
        work();
    }
    return 0;
}
2025/7/25 01:01
加载中...