Submission #513223

#TimeUsernameProblemLanguageResultExecution timeMemory
513223wiwihoConstellation 3 (JOI20_constellation3)C++14
35 / 100
491 ms524292 KiB
#include <bits/stdc++.h>

#define mp make_pair
#define F first
#define S second
#define iter(a) a.begin(), a.end()
#define lsort(a) sort(iter(a))
#define gsort(a) sort(iter(a), greater<>())
#define eb emplace_back
#define printv(a, b) { \
    for(auto pv : a) b << pv << " "; \
    b << "\n"; \
}

using namespace std;

typedef long long ll;

using pii = pair<int, int>;

struct seg{
    int l, r, id;
    bool operator<(seg b) const {
        return l < b.l;
    }
};

ostream& operator<<(ostream& o, seg s){
    return o << '(' << s.l << ',' << s.r << ',' << s.id << ')';
}

vector<vector<int>> g, star;
vector<int> lp, rp;
vector<int> a, X, Y;
vector<ll> C;

vector<vector<ll>> dp;
vector<ll> sub;
int n;

void dfs(int now){
    ll total = 0;
    for(int i : star[now]) total += C[i];
    sub[now] = total;

    ll sum = 0;
    
    for(int i : g[now]){
        dfs(i);
    }

    vector<ll> tmp(n + 1);
    for(int i = 0; i <= n; i++){
        for(int j : g[now]) tmp[i] += dp[j][i];
    }

    ll cn = total + tmp[0];
    for(int i : star[now]){
        int x = X[i];
        cn = min(cn, tmp[x] + total - C[i]);
    }
    for(int i = 0; i <= n; i++){
        if(lp[now] <= i && i <= rp[now]) dp[now][i] = total + tmp[i];
        else dp[now][i] = cn;
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;

    vector<pii> e;

    a.resize(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        e.eb(mp(a[i], i));
    }

    int m;
    cin >> m;
    X.resize(m + 1);
    Y.resize(m + 1);
    C.resize(m + 1);
    for(int i = 1; i <= m; i++){
        cin >> X[i] >> Y[i] >> C[i];
        e.eb(mp(Y[i], -i));
    }

    gsort(e);

    set<seg> st;
    st.insert(seg({1, n, 1}));
    int ts = 1;
    g.resize(2);
    star.resize(2);
    lp.resize(2);
    rp.resize(2);
    lp[1] = 1;
    rp[1] = n;

    for(int i = 0; i < e.size(); ){
        
        int y = e[i].F;

        for(; i < e.size() && e[i].F == y; i++){

            if(e[i].S > 0){
                int pos = e[i].S;
                
                auto it = st.upper_bound(seg({pos, 0, 0}));
                if(it == st.begin()) continue;
                it--;
                if(it->r < pos) continue;

                int l = it->l, r = it->r;
                int id = it->id;
                st.erase(it);
                if(l < pos){
                    st.insert(seg({l, pos - 1, ++ts}));
                    g.eb(); star.eb(); lp.eb(); rp.eb();
                    g[id].eb(ts);
                    lp[ts] = l;
                    rp[ts] = pos - 1;
                }
                if(pos < r){
                    st.insert(seg({pos + 1, r, ++ts}));
                    g.eb(); star.eb(); lp.eb(); rp.eb();
                    g[id].eb(ts);
                    lp[ts] = pos + 1;
                    rp[ts] = r;
                }
                //cerr << "split\n";
                //printv(st, cerr);
                continue;
            }

            int id = -e[i].S;
            //cerr << "add star " << id << "\n";
            //printv(st, cerr);
            int x = X[id];
            auto it = st.upper_bound(seg({x, 0, 0}));
            it--;

            int v = it->id;
            star[v].eb(id);
        }

    }

    /*for(int i = 1; i <= ts; i++){
        cerr << "seg " << i << " " << lp[i] << "  ";
        printv(star[i], cerr);
        printv(g[i], cerr);
    }*/

    dp.resize(ts + 1, vector<ll>(n + 1));
    sub.resize(ts + 1);
    dfs(1);

    cout << dp[1][0] << "\n";
    
    return 0;
}

Compilation message (stderr)

constellation3.cpp: In function 'void dfs(int)':
constellation3.cpp:46:8: warning: unused variable 'sum' [-Wunused-variable]
   46 |     ll sum = 0;
      |        ^~~
constellation3.cpp: In function 'int main()':
constellation3.cpp:104:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |     for(int i = 0; i < e.size(); ){
      |                    ~~^~~~~~~~~~
constellation3.cpp:108:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |         for(; i < e.size() && e[i].F == y; i++){
      |               ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...