제출 #1353026

#제출 시각아이디문제언어결과실행 시간메모리
1353026branches1029PPP (EGOI23_ppp)C++20
65 / 100
288 ms52400 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, m;
int node=1;
int idx[400005];
int who[400005];
int cnt[400005];
int dis[400005];
int t[400005];
vector<int> a[400005];

set< pair<int,int> > st;

void dfs( int i ){
    if( who[i]==1e9 ){
        cnt[st.begin()->second]++;
        return;
    }
    for( int u : a[i] ){
        auto it=st.lower_bound({ -dis[who[i]], who[i] });
        dis[who[i]]+=t[i]-t[u];
        st.insert({ -dis[who[i]], who[i] });
        if( it!=st.end() ) st.erase( it );
        dfs( u );
        auto it2=st.lower_bound({ -dis[who[i]], who[i] });
        dis[who[i]]-=t[i]-t[u];
        st.insert({ -dis[who[i]], who[i] });
        st.erase( it2 );
    }
}

int main(){

    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> m;
    for( int i=1 ; i<=m ; i++ ){
        int x, y;
        cin >> x >> y;
        int m=node++; // medal
        who[m]=1e9;

        int xi, yi;
        if( idx[x]==0 ) xi=node++, who[xi]=x, idx[x]=xi;
        else xi=idx[x];
        if( idx[y]==0 ) yi=node++, who[yi]=y, idx[y]=yi;
        else yi=idx[y];
        a[xi].push_back(m);
        a[xi].push_back(yi);
        t[m]=t[yi]=i;
        idx[y]=0;
    }

    for( int i=1 ; i<node ; i++ ){
        if( t[i]==0 ){
            t[i]=m+1;
            st.clear();
            dfs( i );
        }
    }

    for( int i=0 ; i<n ; i++ ){
        cout << cnt[i] << ' ';
    }

    return 0;
}
#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...