제출 #1368525

#제출 시각아이디문제언어결과실행 시간메모리
1368525goulthenPPP (EGOI23_ppp)C++20
36 / 100
528 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;

//#define int long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define fi first
#define se second

const int MAXN = 3e5+10;
vector<int> g[MAXN];
int lst[MAXN], dp[MAXN], ans[MAXN], wnr[MAXN], par[MAXN], cnt[MAXN];

void dfs(int u) {
    auto add = [&](int x, int medal) {
        dp[medal] = x;
        ans[x]++;
    };

    for(int &v : g[u]) {
        int x = wnr[v], y = dp[u];
        cnt[x] += u-v;
        if(cnt[x]>cnt[y]) add(x,v);
        if(cnt[x]<cnt[y]) add(y,v);
        if(cnt[x]==cnt[y]) add(min(y,x),v);

        dfs(v);
        cnt[x] -= u-v;
    }
}

void clear(int u) {
    cnt[wnr[u]] = 0;
    for(int &v : g[u]) clear(v);
}

int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
    int n,m; cin >> n >> m;
    vector<pii> a(m);
    rep(i,1,m) cin >> a[i-1].fi >> a[i-1].se;
    rep(i,0,m-1) lst[i] = -1, par[i] = i;


    per(i,m-1,0) {
        auto [x,y] = a[i];
        wnr[i] = x;
        if(lst[x] != -1) {
            g[lst[x]].pb(i);
            par[i] = lst[x];
        }
        lst[y] = i;
    }

    per(i,m-1,0) {
        if(par[i]!=i) continue;
        ans[wnr[i]]++;
        cnt[wnr[i]] = m-i;
        dp[i] = wnr[i];
        dfs(i);
        clear(i);
    }


    rep(i,0,n-1) cout << ans[i] << ' ';
    cout << '\n';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…