Submission #313590

#TimeUsernameProblemLanguageResultExecution timeMemory
313590juggernautSwapping Cities (APIO20_swap)C++14
100 / 100
746 ms52840 KiB
//#include"grader.cpp"
#include"swap.h"
#include<bits/stdc++.h>
#define fr first
#define sc second
using namespace std;
vector<pair<int,int>>g[100005];
vector<int>child[100005];
int timer,tin[100005],tout[100005],up[100005][17],sp1[100005][17],sp2[100005][17],inf=2e9,par[100005],deg[100005];
int fin(int v){
    if(v==par[v])return v;
    return par[v]=fin(par[v]);
}
void dfs(int v,int p,int cost){
    tin[v]=++timer;
    up[v][0]=p;
    sp1[v][0]=cost;
    for(int i=1;i<17;i++){
        up[v][i]=up[up[v][i-1]][i-1];
        sp1[v][i]=max(sp1[v][i-1],sp1[up[v][i-1]][i-1]);
        sp2[v][i]=min(sp2[v][i-1],sp2[up[v][i-1]][i-1]);
    }
    for(auto to:g[v])if(to.fr!=p)dfs(to.fr,v,to.sc);
    tout[v]=++timer;
}
bool upper(int a,int b){
    return tin[a]<tin[b]&&tout[a]>tout[b];
}
int lca(int a,int b){
	if(upper(a,b))return a;
	if(upper(b,a))return b;
	for(int i=16;i>=0;i--)if(!upper(up[a][i],b))a=up[a][i];
	return up[a][0];
}
int fin1(int a,int p){
    int res=0;
    for(int i=16;i>=0;i--)
        if(!upper(up[a][i],p)){
            res=max(res,sp1[a][i]);
            a=up[a][i];
        }
    return res;
}
int fin2(int a,int p){
    int res=inf;
    for(int i=16;i>=0;i--)
        if(!upper(up[a][i],p)){
            res=min(res,sp2[a][i]);
            a=up[a][i];
        }
    return res;
}
bool cmp(pair<int,int>l,pair<int,int>r){
    return l.sc<r.sc;
}
void add_edge(int a,int b,int c){
    int aa=fin(a),bb=fin(b);
    deg[a]++;
    deg[b]++;
    if(aa!=bb){
        if( sp2[aa][0]==inf && ( sp2[bb][0]!=inf ||deg[a]==3||deg[b]==3 )){
            for(int i = 0; i<child[aa].size(); i++){
                sp2[child[aa][i]][0]=c;
            }
            child[aa].clear();
        }
        if( sp2[bb][0]==inf && ( sp2[aa][0]!=inf ||deg[a]==3||deg[b]==3 )){
            for(int i = 0; i<child[bb].size(); i++){
                sp2[child[bb][i]][0]=c;
            }
            child[bb].clear();
        }
        g[a].push_back({b,c});
        g[b].push_back({a,c});
        if(child[aa].size()<child[bb].size())swap(aa,bb);
        par[bb]=aa;
        child[aa].insert(child[aa].end(),child[bb].begin(),child[bb].end());
        child[bb].clear();
    }else{
        if(sp2[aa][0]==inf){
            for(int i = 0; i<child[aa].size(); i++){
                sp2[child[aa][i]][0]=c;
            }
            child[aa].clear();
        }
    }
}
bool cmp2(pair<pair<int,int>,int>l,pair<pair<int,int>,int>r){
    return l.sc<r.sc;
}
void init(int N,int M,vector<int>U,vector<int>V,vector<int>W){
    for(int i=0;i<N;i++)child[i].push_back(i),par[i]=i,sp2[i][0]=inf;
    vector<pair<pair<int,int>,int>>ed;
    for(int i=0;i<M;i++)ed.push_back({{U[i],V[i]},W[i]});
    sort(ed.begin(),ed.end(),cmp2);
    for(auto to:ed)
        add_edge(to.fr.fr,to.fr.sc,to.sc);
    for(int i=0;i<N;i++)sort(g[i].begin(),g[i].end(),cmp);
    dfs(0,0,0);
}
int getMinimumFuelCapacity(int X,int Y){
    int l=lca(X,Y),res;
    res=max(min(fin2(X,l),fin2(Y,l)),max(fin1(X,l),fin1(Y,l)));
    if(res==inf)res=-1;
    return res;
}

Compilation message (stderr)

swap.cpp: In function 'void add_edge(int, int, int)':
swap.cpp:62:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |             for(int i = 0; i<child[aa].size(); i++){
      |                            ~^~~~~~~~~~~~~~~~~
swap.cpp:68:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |             for(int i = 0; i<child[bb].size(); i++){
      |                            ~^~~~~~~~~~~~~~~~~
swap.cpp:81:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |             for(int i = 0; i<child[aa].size(); i++){
      |                            ~^~~~~~~~~~~~~~~~~
#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...