Submission #1329811

#TimeUsernameProblemLanguageResultExecution timeMemory
1329811settopTeam Coding (EGOI24_teamcoding)C++20
81 / 100
4135 ms884552 KiB
#include<bits/stdc++.h>

using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ll long long
#define double long double
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define S second
#define F first
#define fall(i,a,n) for(int i=a;i<=n;i++)
#define rfall(i,a,n) for(int i=a;i>=n;i--)
#define pb push_back
#define all(x) x.begin(),x.end()
#define lsb(x) (x & -x)
#define sz(x) (int)x.size()
const int MAXN=2e5+10;
const int MAXL=22;
const int inf=1e18;
const int MOD=998244353;
const int HASHMOD=1000000001237;
const int HASHBASE=146527;
 
typedef pair<int,int> pii;
typedef tuple<int,int,int> trio;
typedef tuple<int,int,int,int> squad; 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//auto start=chrono::high_resolution_clock::now();
/*auto end=chrono::high_resolution_clock::now();
auto dur=chrono::duration<double>(end-start).count();
cout<<dur<<"\n";*/

map<int,map<int,int>> mp[MAXN]; //vertice,cor,dep
map<int,int> alltree[MAXN],tot[MAXN];
int n,k,cor[MAXN],raiz,f[MAXN],dep[MAXN],tin[MAXN],cur,dp[MAXN],ans,swa,cure,curs,op;
vector<int> g[MAXN],caras[MAXN];
vector<pii> v[MAXN],td;
vector<bool> init;

void dfs(int x){
    f[cor[x]]++;
    alltree[cor[x]][dep[x]]++;
    mp[x][cor[x]][dep[x]]++;
    v[x].pb({cor[x],dep[x]});
    tot[x][dep[x]]++;

    for(auto u:g[x]){
        dfs(u);
        if(sz(v[u])>sz(v[x])) mp[x].swap(mp[u]),tot[x].swap(tot[u]),v[x].swap(v[u]);
        for(auto [b,c]:v[u]){
            mp[x][b][c]++;
            v[x].pb({b,c});
            tot[x][c]++;
        }
    }

    f[cor[x]]--;
    if(sz(caras[cor[x]])>raiz || f[cor[x]]) return;

    int rs=0,sp=0;

    vector<int> ad;

    op+=sz(caras[cor[x]]);
    for(auto u:caras[cor[x]]){
        if(tin[u]>=tin[x] && tin[x]+dp[x]>=tin[u]){
            rs++;
            continue;
        }
        int q=tot[x][dep[u]]-mp[x][cor[x]][dep[u]];
        if(q>0){
            tot[x][dep[u]]--;
            ad.pb(dep[u]);
            rs++;
            sp++;
        }
    }
    for(auto u:ad) tot[x][u]++;

    if(ans<rs || (ans==rs && sp<swa)) ans=rs,swa=sp;
}

void dfs1(int x){
    tin[x]=++cur;
    for(auto u:g[x]){
        dep[u]=dep[x]+1;
        dfs1(u);
        dp[x]+=dp[u]+1;
    }
}

void dfsset(int x){
    td.pb({cor[x],dep[x]});
    alltree[cor[x]][dep[x]]--;
    for(auto u:g[x]) dfsset(u);
}

void dfstake(int x,int color){
    if(cor[x]==color)cure++;
    else if(alltree[color][dep[x]]) cure++,curs++,alltree[color][dep[x]]--,td.pb({color,dep[x]});
    for(auto u:g[x]) dfstake(u,color);
}

void process(int x){
    td.clear();
    dfsset(x);
    cure=curs=0;
    dfstake(x,cor[x]);
    if(ans<cure || (ans==cure && curs<swa)) ans=cure,swa=curs;
    for(auto [u,j]:td) alltree[u][j]++;
}

void dfs2(int x){
    f[cor[x]]++;
    for(auto u:g[x]) dfs2(u);
    f[cor[x]]--;
    if(f[cor[x]] || sz(caras[cor[x]])<=raiz) return;
    process(x);
}

int32_t main(){
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>n>>k;

    raiz=sqrt(n);

    fall(i,0,n-1){
        cin>>cor[i]; 
        caras[cor[i]].pb(i);
    }

    fall(i,1,n-1){
        int p; cin>>p;
        g[p].pb(i);
    }
    dfs1(0);
    dfs(0);
    fall(i,0,k-1) f[i]=0;
    dfs2(0);
    cout<<ans<<" "<<swa<<"\n";

}

Compilation message (stderr)

Main.cpp:21:15: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   21 | const int inf=1e18;
      |               ^~~~
Main.cpp:23:19: warning: overflow in conversion from 'long int' to 'int' changes value from '1000000001237' to '-727378731' [-Woverflow]
   23 | const int HASHMOD=1000000001237;
      |                   ^~~~~~~~~~~~~
#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...