제출 #1329821

#제출 시각아이디문제언어결과실행 시간메모리
1329821settopTeam Coding (EGOI24_teamcoding)C++20
81 / 100
2341 ms1114112 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";*/

unordered_map<ll,int> mp[MAXN]; //vertice,cor,dep
unordered_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;

ll key(ll a,int b){
    ll ret=(a<<32LL)|b; 
    return ret;
}

ll rev(ll x){
    return (x&((1LL<<30)-1));
}

void dfs(int x){
    f[cor[x]]++;
    alltree[cor[x]][dep[x]]++;
    mp[x][key(cor[x],dep[x])]++;
    tot[x][dep[x]]++;

    for(auto u:g[x]){
        dfs(u);
        if(sz(mp[u])>sz(mp[x])) mp[x].swap(mp[u]),tot[x].swap(tot[u]);
        for(auto [lz,fr]:mp[u]){
            mp[x][lz]+=fr;
            tot[x][rev(lz)]+=fr;
        }
    }

    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][key(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)+1;

    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";
}

컴파일 시 표준 에러 (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...