제출 #435752

#제출 시각아이디문제언어결과실행 시간메모리
4357522qbingxuanTwo Dishes (JOI19_dishes)C++14
74 / 100
2526 ms274060 KiB
#include <bits/stdc++.h>
#ifdef local
#define safe std::cerr<<__PRETTY_FUNCTION__<<" line "<<__LINE__<<" safe\n"
#define debug(a...) qqbx(#a, a)
template <typename ...T> void qqbx(const char *s, T ...a) {
    int cnt = sizeof...(T);
    ((std::cerr << "(" << s << ") = (") , ... , (std::cerr << a << (--cnt ? ", " : ")\n")));
}
#else
#define debug(...) ((void)0)
#define safe ((void)0)
#endif // local
 
using namespace std;
const int maxn = 1000025;
template <typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>;
 
struct Item {
    int t;
    int64_t ed;
    int val;
} v[maxn], u[maxn];
int64_t sumv[maxn], sumu[maxn];
int posv[maxn], posu[maxn];
int64_t dp[maxn], dif[maxn], lim[maxn];
signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> v[i].t >> v[i].ed >> v[i].val;
    for (int i = 1; i <= m; i++)
        cin >> u[i].t >> u[i].ed >> u[i].val;
 
    for (int i = 1; i <= n; i++)
        sumv[i] = sumv[i-1] + v[i].t;
    for (int i = 1; i <= m; i++)
        sumu[i] = sumu[i-1] + u[i].t;
 
    for (int i = 1; i <= n; i++)
        posv[i] = upper_bound(sumu, sumu+m+1, v[i].ed - sumv[i]) - sumu - 1;
    for (int i = 1; i <= m; i++)
        posu[i] = upper_bound(sumv, sumv+n+1, u[i].ed - sumu[i]) - sumv - 1;
 
    for (int j = 1; j <= m; j++) dp[j] = dp[j-1] + (posu[j] >= 0 ? u[j].val : 0);
    for (int j = 1; j <= m; j++) lim[j] = dif[j] = (posu[j] >= 0 ? u[j].val : 0);
 
    /*
    cerr << "posu:\t";
    cerr << 0 << ' ';
    for (int i = 1; i <= m; i++) cerr << posu[i] << ' ';
    cerr << '\n';
    cerr << "u.val:\t";
    cerr << 0 << ' ';
    for (int i = 1; i <= m; i++) cerr << u[i].val << ' ';
    cerr << '\n';
    */
 
    set<int> st;
    min_heap<pair<int,int>> pq;
    for (int j = 1; j <= m; j++) if (posu[j] >= 0) pq.emplace(posu[j], j);
 
    function<void(int,int,int64_t)> update = [&](int i, int j, int64_t val) {
        if (val == 0 || j == m+1) return;
        if (val < 0) {
            dif[j] += val;
            st.insert(j);
            return;
        }
        if (dif[j] - val <= lim[j]) {
            int64_t c = lim[j] - (dif[j] - val);
            dif[j] = lim[j];
            st.erase(j);
            auto it = st.lower_bound(j);
            if (it != st.end())
                update(i, *it, c);
        } else {
            dif[j] -= val;
        }
        // int64_t c = max<int64_t>(0, (j != 0 && i <= posu[j] ? u[j].val : 0) - dif[j]);
    };
    for (int i = 1; i <= n; i++) {
        while (!pq.empty() && i > pq.top().first) {
            int j = pq.top().second;
            pq.pop();
            lim[j] = 0;
            if (dif[j] > lim[j])
                st.insert(j);
          	else
            	dif[j] = lim[j];
        }
 
        dif[0] += v[i].val;
        update(i, posv[i]+1, v[i].val);
 
 
        /*
        for (int j = 0; j <= posv[i]; j++) dp[j] += v[i].val;
        for (int j = 1; j <= m; j++) dp[j] = max(dp[j], dp[j-1] + (i <= posu[j] ? u[j].val : 0));
 
        cerr << posv[i] << ';' << v[i].val << ";\t";
        for (int j = 0; j <= m; j++) cerr << (dp[j] - (j ? dp[j-1] : 0)) << ' ';
        cerr << '\n';
        */
    }
    debug(dp[m]);
    int64_t sum = 0;
    for (int i = 0; i <= m; i++) sum += dif[i];
    cout << sum << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...