比赛 2025暑假集训第一场 评测结果 AAAAAAAAAAAAAAAAAATT
题目名称 免费的馅饼(加强版) 最终得分 90
用户昵称 健康铀 运行时间 4.554 s
代码语言 C++ 内存使用 7.07 MiB
提交时间 2025-06-25 09:52:20
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const long long INF = -1e18;

struct F {
    vector<long long> t;
    int n;
    F(int s) {
        n = s;
        t.resize(n+1, INF);
    }
    void u(int p, long long v) {
        while (p <= n) {
            if (v > t[p]) 
                t[p] = v;
            p += p & -p;
        }
    }
    long long q(int p) {
        long long r = INF;
        while (p) {
            if (t[p] > r) 
                r = t[p];
            p -= p & -p;
        }
        return r;
    }
};

struct P {
    int t, p, v;
    long long A, B;
    P() {}
    P(int t, int p, int v, long long A, long long B) : t(t), p(p), v(v), A(A), B(B) {}
};

vector<P> a;
vector<long long> dp;
map<long long, int> m;

void cdq(int l, int r) {
    if (l >= r) 
        return;
    
    int m0 = (l + r) / 2;
    int t0 = a[m0].t;
    int rs = r+1;
    for (int i = m0+1; i <= r; i++) {
        if (a[i].t > t0) {
            rs = i;
            break;
        }
    }
    if (rs > r) {
        return;
    }
    
    cdq(l, rs-1);
    
    vector<int> le, ri;
    for (int i = l; i <= rs-1; i++) 
        le.push_back(i);
    for (int i = rs; i <= r; i++) 
        ri.push_back(i);
    
    sort(le.begin(), le.end(), [&](int i, int j) {
        if (a[i].A != a[j].A) 
            return a[i].A > a[j].A;
        else 
            return a[i].B < a[j].B;
    });
    
    sort(ri.begin(), ri.end(), [&](int i, int j) {
        if (a[i].A != a[j].A) 
            return a[i].A > a[j].A;
        else 
            return a[i].B < a[j].B;
    });
    
    int s = m.size();
    F f(s);
    
    int j = 0;
    for (int i = 0; i < ri.size(); i++) {
        int ir = ri[i];
        while (j < le.size() && a[le[j]].A >= a[ir].A) {
            int il = le[j];
            long long b = a[il].B;
            int p = m[b];
            f.u(p, dp[il]);
            j++;
        }
        long long b = a[ir].B;
        int p = m[b];
        long long tmp = f.q(p);
        if (tmp != INF) {
            if (tmp + a[ir].v > dp[ir]) {
                dp[ir] = tmp + a[ir].v;
            }
        }
    }
    
    cdq(rs, r);
}

int main() {
	freopen("free.in","r",stdin);
		freopen("free.out","w",stdout);
	 ios::sync_with_stdio(false);
	    cin.tie(nullptr);
    int w, n;
    cin>>w>>n;
    map<pair<int, int>, long long> mp;
    for (int i = 0; i < n; i++) {
        int t, p, v;
        cin>>t>>p>>v;
        mp[make_pair(t, p)] += v;
    }
    
    vector<P> a0;
    for (auto &it : mp) {
        int t = it.first.first;
        int p = it.first.second;
        long long v = it.second;
        long long A = (long long)p - 2ll * t;
        long long B = (long long)p + 2ll * t;
        a0.push_back(P(t, p, v, A, B));
    }
    n = a0.size();
    a = a0;
    
    sort(a.begin(), a.end(), [](const P &a, const P &b) {
        if (a.t != b.t) 
            return a.t < b.t;
        return a.p < b.p;
    });
    
    vector<long long> b;
    for (int i = 0; i < n; i++) {
        b.push_back(a[i].B);
    }
    sort(b.begin(), b.end());
    b.erase(unique(b.begin(), b.end()), b.end());
    m.clear();
    for (int i = 0; i < b.size(); i++) {
        m[b[i]] = i+1;
    }
    
    dp.resize(n);
    for (int i = 0; i < n; i++) {
        dp[i] = a[i].v;
    }
    
    cdq(0, n-1);
    
    long long ans = *max_element(dp.begin(), dp.end());
    cout << ans << endl;
    
    return 0;
}