제출 #1353002

#제출 시각아이디문제언어결과실행 시간메모리
1353002yyc000123PPP (EGOI23_ppp)C++20
100 / 100
176 ms55564 KiB
#include<bits/stdc++.h>
using namespace std ;
#define F first
#define S second
const int N = 2e5+5 ;
const int M = 2e5+5 ;
int n , m , nxt[M] , vis[M] , ans[M] , tim[N] , cnt[N] , mp[N] ;
vector<pair<int,int>> vp ;
vector<int> v[N] , nei[M] ;
set<pair<int,int>> st ;

void dfs(int node){
    vis[node]=1 ;
    if(tim[vp[node].F]) st.erase(st.find({tim[vp[node].F],-vp[node].F})) ;
    tim[vp[node].F]+=nxt[node]-node ;
    st.insert({tim[vp[node].F],-vp[node].F}) ;
    ans[node]=-st.rbegin()->S ;
    for(int i:nei[node]) dfs(i) ;
    st.erase(st.find({tim[vp[node].F],-vp[node].F})) ;
    tim[vp[node].F]-=nxt[node]-node ;
    if(tim[vp[node].F]) st.insert({tim[vp[node].F],-vp[node].F}) ;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
    cin >> n >> m ;
    vp.resize(m) ;
    for(int i=0 ; i<m ; i++){
        cin >> vp[i].F >> vp[i].S ;
        v[vp[i].F].push_back(i) ;
        v[vp[i].S].push_back(i) ;
    }
    for(int i=0 ; i<m ; i++){
        int temp = upper_bound(v[vp[i].F].begin(),v[vp[i].F].end(),i)-v[vp[i].F].begin() ;
        if(temp==v[vp[i].F].size()) nxt[i]=m ;
        else nxt[i]=v[vp[i].F][temp] ;
    }
    for(int i=0 ; i<m ; i++){
        if(nxt[i]!=-1) nei[nxt[i]].push_back(i) ;
    }
    for(int i=m-1 ; i>=0 ; i--){
        if(!vis[i]) dfs(i) ;
    }
    for(int i=0 ; i<m ; i++) cnt[ans[i]]++ ;
    for(int i=0 ; i<n ; i++) cout << cnt[i] << ' ' ;
    cout << '\n' ;
    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...