제출 #1277711

#제출 시각아이디문제언어결과실행 시간메모리
1277711dostsVinjete (COI22_vinjete)C++20
100 / 100
314 ms71784 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e9;

const int N = 1e5+1;
vector<pair<int,pii>> edges[N];
vector<pii> v2;
vi ans(N);

struct ST {
    vector<pii> t;
    vi lazy;
    pii merge(pii p2,pii p3) {
        if (p2.ff < p3.ff) return p2;
        else if (p2.ff > p3.ff) return p3;
        else return {p2.ff,p2.ss+p3.ss};
    }
    void build(int node,int l,int r) {
        if (l == r) {
            //cout << "E" sp l sp v2[l-1].ff sp v2[l-1].ss << endl;
            t[node] = {0,v2[l-1].ss};
            return;
        }
        int m = (l+r) >> 1;
        build(2*node,l,m),build(2*node+1,m+1,r);
        t[node] = merge(t[2*node],t[2*node+1]);
    }

    ST(){}
    ST(int nn) {
        lazy.assign(4*nn+1,0);
        t.resize(4*nn+1);
        build(1,1,nn);
    }

    void push(int node,bool leaf) {
        if (!lazy[node]) return;
        t[node].ff+=lazy[node];
        if (!leaf){
            lazy[2*node]+=lazy[node];
            lazy[2*node+1]+=lazy[node];
        }
        lazy[node] = 0;
    }

    pii query(int node,int l,int r,int L,int R) {
        push(node,l==r);
        if (l > R || r < L) return {inf,0};
        if (l >= L && r <= R) return t[node];
        int m = (l+r) >> 1;
        return merge(query(2*node,l,m,L,R),query(2*node+1,m+1,r,L,R));
    }

    void update(int node,int l,int r,int L,int R,int v) {
        push(node,l==r);
        if (l > R || r < L) return;
        if (l >= L && r <= R) {
            lazy[node]+=v;
            push(node,l==r);
            return;
        }
        int m = (l+r) >> 1;
        update(2*node,l,m,L,R,v),update(2*node+1,m+1,r,L,R,v);
        t[node] = merge(t[2*node],t[2*node+1]);
    }
}st;

int idx(int x) {
    return upper_bound(all(v2),pii{x,inf})-v2.begin();
}

int sz;
void dfs(int node,int p) {
    //cout <<" ENTER " sp node << endl;
    //for (int j = 1;j<=sz;j++) cout << '(' sp st.query(1,1,sz,j,j).ff sp st.query(1,1,sz,j,j).ss sp ')' << ' ';
    //cout << '\n';
    pii qq = st.query(1,1,sz,1,sz);
    //cout << qq.ff sp qq.ss << endl;
    ans[node] = (!qq.ff)?(qq.ss):0ll;
    for (auto it : edges[node]) {
        if (it.ff == p) continue;
        int le = idx(it.ss.ff),ri = idx(it.ss.ss);
        //cout << "+" sp le sp ri << endl;
        st.update(1,1,sz,le,ri,1);
        dfs(it.ff,node);
        st.update(1,1,sz,le,ri,-1);
        //cout << "-" sp le sp ri << endl;
    }
}

void solve() {
    int n,m;
    cin >> n >> m;
    vi v;
    for (int i=1;i<=n-1;i++) {
        int a,b,l,r;
        cin >> a >> b >> l >> r;
        v.push_back(l);
        v.push_back(r);
        edges[a].push_back({b,{l,r}});
        edges[b].push_back({a,{l,r}});
    }
    sort(all(v));
    v.erase(unique(v.begin(),v.end()),v.end());
    if (v[0] != 1) v.insert(v.begin(),1);
    if (v.back() != m) v.push_back(m);
    for (int i = 0;i<big(v)-1;i++) {
        if (v[i+1]-v[i] > 1) v2.push_back({v[i]+1,v[i+1]-v[i]-1});
        v2.push_back({v[i],1});
    }
    v2.push_back({v.back(),1});
    sort(all(v2));
    sz = big(v2);
    st = ST(sz);
    dfs(1,1);
    for (int i=2;i<=n;i++) cout << m-ans[i] << '\n';
} 

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    #ifdef Dodi
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) 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...