제출 #1329007

#제출 시각아이디문제언어결과실행 시간메모리
1329007nathjessVinjete (COI22_vinjete)C++20
100 / 100
132 ms49464 KiB
# include <bits/stdc++.h>
# define int long long
# define vi vector<int>
# define pb push_back
# define pii pair<int, int>
# define fi first
# define se second
# define endl '\n'
# define jess ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

struct node {
    int v, l, r;
};

int n, m, u[100005], v[100005], l[100005], r[100005], ans, val[100005];
vector<node> adj[100005];
set<pii> s;

void dfs(int x, int p) {
    val[x]=ans;
    
    // cout << "cur " << x << endl;
    // for(auto j : s) cout << "isi " << j.fi << " " << j.se << endl;

    for(auto i : adj[x]) {
        if(i.v==p) continue;

        vector<pii> seg, sega;
        int ok, bef=ans;
        if(s.empty()) {
            // if kosong
            ok=1;
            ans+=(i.r-i.l+1);
            s.insert({i.l, i.r});
        }
        else if((*s.rbegin()).fi<i.l) {
            // if nilai l < i.l semua
            pii tmp=*s.rbegin();
            if(tmp.se>=i.l) {
                ok=2;
                s.erase(tmp);
                seg.pb(tmp);
                ans-=(tmp.se-tmp.fi+1);
                tmp.se=max(tmp.se, i.r);
                s.insert(tmp);
                sega.pb(tmp);
                ans+=(tmp.se-tmp.fi+1);
            } else {
                ok=4;
                s.insert({i.l, i.r});
                sega.pb({i.l, i.r});
                ans+=(i.r-i.l+1);
            }
        }
        else {
            ok=3;
            auto it=s.lower_bound({i.l, 0});
            if(it != s.begin()) it--;

            int lm=i.l, rm=i.r;
            while(it != s.end()) {
                pii val=*it;
                if(val.fi<i.l && val.se<i.l) {
                    
                }
                else if(val.fi<i.l && val.se>=i.l) {
                    // intersecting with L
                    lm=val.fi;
                    rm=max(rm, val.se);
                    seg.pb(val);
                    ans-=(val.se-val.fi+1);
                }
                else if(val.fi>=i.l && val.se<=i.r) {
                    //di dalam segment
                    seg.pb(val);
                    ans-=(val.se-val.fi+1);
                }
                else if(val.fi<=i.r && val.se>i.r) {
                    //intersecting with R
                    seg.pb(val);
                    rm=val.se;
                    lm=min(lm, val.fi);
                    ans-=(val.se-val.fi+1);
                } 
                else break;
                it++;
            }   

            for(auto j : seg) s.erase(j);
            s.insert({lm, rm});
            sega.pb({lm, rm});
            ans+=(rm-lm+1);
        }
        
        dfs(i.v, x);

        ans=bef;
        if(ok==1) {
            s.clear();
        }
        else if(ok==2 || ok==3 || ok==4) {
            for(auto j : sega) s.erase(j);
            for(auto j : seg) s.insert(j);
        } 
    }
}

void solve () {
    cin >> n >> m;
    for(int i=1; i<n; i++) {
        cin >> u[i] >> v[i] >> l[i] >> r[i];
        adj[u[i]].pb({v[i], l[i], r[i]});
        adj[v[i]].pb({u[i], l[i], r[i]});
    }
    dfs(1, -1);
    for(int i=2; i<=n; i++) {
        cout << val[i] << endl;
    }
}
 
signed main() {
   jess;
   solve();
}
#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...