제출 #1354354

#제출 시각아이디문제언어결과실행 시간메모리
1354354kokokaiMeetings 2 (JOI21_meetings2)C++20
100 / 100
230 ms40276 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
const int N = 2e5+5;
const int LG = 19;
int anc[N][LG];
int h[N],sz[N],val[N];
vector<int> adj[N];
int n;
int ans[N];
void dfs(int u,int p){
    h[u]=h[p]+1;
    anc[u][0]=p;
    for(int lg=1;lg<LG;lg++) anc[u][lg]=anc[anc[u][lg-1]][lg-1];
    sz[u]=1;
    for(int v:adj[u]){
        if(v==p) continue;
        dfs(v,u);
        sz[u] += sz[v];
    }
}
int lca(int u,int v){
    if(h[u]<h[v]) swap(u,v);
    int d=h[u]-h[v];
    for(int lg=LG-1;lg>=0;lg--){
        if((d&(1<<lg))>0)u=anc[u][lg];
    }
    if(u==v) return u;
    for(int lg=LG-1;lg>=0;lg--){
        if(anc[u][lg] != anc[v][lg]){
            u=anc[u][lg];
            v=anc[v][lg];
        }
    }
    return anc[u][0];
}
int dist(int u,int v){
    int lc=lca(u,v);
    return h[u]+h[v]-2*h[lc];
}
int lab[N];
int da[N],db[N];
pair<int,int> e[N];
int mxdia=0;
int findpar(int u){
    if(lab[u]<0) return u;
    return lab[u]=findpar(lab[u]);
}
void unite(int u,int v){
    u=findpar(u);
    v=findpar(v);
    if(u==v) return;
    if(lab[u]>lab[v]) swap(u,v);
    lab[u] += lab[v];
    lab[v] = u;
    vector<int> ver;
    ver.push_back(da[u]);
    ver.push_back(da[v]);
    ver.push_back(db[u]);
    ver.push_back(db[v]);
    for(int i=0;i<4;i++){
        for(int j=i+1;j<4;j++){
            if(dist(ver[i],ver[j]) > dist(da[u],db[u])){
                da[u]=ver[i];
                db[u]=ver[j];
            }
        }
    }
    mxdia=max(mxdia,dist(da[u],db[u]));
    return;
}
int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
    }
    cin>>n;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        e[i]={u,v};
    }
    dfs(1,0);
    memset(lab,-1,sizeof lab);
    for(int i=1;i<=n;i++){
        da[i]=db[i]=i;
    }
    for(int i=1;i<n;i++){
        if(h[e[i].fi] < h[e[i].se]) swap(e[i].fi,e[i].se);
    }
    sort(e+1,e+n,[&](pair<int,int> a,pair<int,int> b){
        return min(sz[a.fi],n-sz[a.fi]) < min(sz[b.fi],n-sz[b.fi]);
    });
    int i=n-1;

    for(int va=n;va>=1;va--){
        while(i>=1 && min(sz[e[i].fi],n-sz[e[i].fi]) >= va){
            //cerr<<va<<' '<<i<<'\n';
            unite(e[i].fi,e[i].se);
            i--;
        }
        ans[va]=mxdia+1;
    }
    for(int i=1;i<=n;i++){
        if(i%2==1) cout<<1<<'\n';
        else cout<<ans[i/2]<<'\n';
    }
}

컴파일 시 표준 에러 (stderr) 메시지

meetings2.cpp: In function 'int main()':
meetings2.cpp:78:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…