Submission #805912

#TimeUsernameProblemLanguageResultExecution timeMemory
805912guagua0407Cat Exercise (JOI23_ho_t4)C++17
100 / 100
248 ms60568 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

void setIO(string s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}

const int mxn=2e5+5;
vector<int> adj[mxn],adj2[mxn];
vector<int> nxt[mxn];
int p[mxn];
int depth[mxn];
int up[20][mxn];


struct DSU{
    vector<int> e;
    vector<int> mx;
    DSU(int n){
        e=vector<int>(n,-1);
        mx=vector<int>(n);
        for(int i=0;i<n;i++){
            mx[i]=i;
        }
    }

    int find(int x){
        return (e[x]<0?x:e[x]=find(e[x]));
    }
    bool unite(int a,int b){
        a=find(a);
        b=find(b);
        if(a==b) return false;
        if(e[a]>e[b]) swap(a,b);
        mx[a]=max(mx[a],mx[b]);
        e[a]+=e[b];
        e[b]=a;
        return true;
    }
};

void dfs(int v,int p=-1){
    if(p!=-1) depth[v]=depth[p]+1;
    if(p!=-1) up[0][v]=p;
    for(auto u:adj2[v]){
        if(u==p) continue;
        dfs(u,v);
    }
}

int lca(int a,int b){
    if(depth[a]<depth[b]) swap(a,b);
    int len=depth[a]-depth[b];
    for(int i=0;i<20;i++){
        if(len&(1<<i)){
            a=up[i][a];
        }
    }
    if(a==b) return a;
    for(int i=19;i>=0;i--){
        int ta=up[i][a];
        int tb=up[i][b];
        if(ta!=tb){
            a=ta;
            b=tb;
        }
    }
    return up[0][a];
}

ll dist(int a,int b){
    int c=lca(a,b);
    return depth[a]+depth[b]-2*depth[c];
}

ll solve(int v){
    ll ans=0;
    for(auto u:nxt[v]){
        ans=max(ans,dist(u,v)+solve(u));
    }
    return ans;
}

int main() {_
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>p[i];
        p[i]--;
    }
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        a--;
        b--;
        a=p[a];
        b=p[b];
        adj2[a].push_back(b);
        adj2[b].push_back(a);
        if(a>b) swap(a,b);
        adj[b].push_back(a);
    }
    DSU dsu(n);
    for(int i=0;i<n;i++){
        for(auto v:adj[i]){
            nxt[i].push_back(dsu.mx[dsu.find(v)]);
        }
        for(auto v:adj[i]){
            dsu.unite(i,v);
        }
    }
    dfs(0);
    for(int i=1;i<20;i++){
        for(int j=0;j<n;j++){
            up[i][j]=up[i-1][up[i-1][j]];
        }
    }
    cout<<solve(n-1);
    return 0;
}
//maybe its multiset not set

Compilation message (stderr)

Main.cpp: In function 'void setIO(std::string)':
Main.cpp:12:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:13:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...