Submission #1132245

#TimeUsernameProblemLanguageResultExecution timeMemory
1132245t9unkubjSwapping Cities (APIO20_swap)C++20
100 / 100
1352 ms29064 KiB
#ifdef t9unkubj
#include"debug.cpp"
//#include"template_no_debug.h"
#else 
#define dbg(...) 199958
#endif

#undef _GLIBCXX_DEBUG
#pragma GCC optimize("O3")
using namespace std;
#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
template<class T>using vc=vector<T>;
template<class T>using vvc=vc<vc<T>>;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++)
#define DREP(i,n,m) for(ll i=(n);i>=(m);i--)
#define drep(i,n) for(ll i=((n)-1);i>=0;i--)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
template<class T,class F>
bool chmin(T &x, F y){
    if(x>y){
        x=y;
        return true;
    }
    return false;
}
template<class T, class F>
bool chmax(T &x, F y){
    if(x<y){
        x=y;
        return true;
    }
    return false;
}
double pass_time=0;
struct hairetu{
    vc<vc<pair<int,int>>>val;
    hairetu(int n=0):val(n,vc<pair<int,int>>(1,{(int)-2e9,0})){}
    //val[i]の時刻tにaをpushする
    void push(int i,int t,int a){
        val[i].push_back({t,a});
    }
    //val[i]の時刻tを見る
    int get(int i,int t){
        int ac=0,wa=val[i].size();
        while(wa-ac>1){
            int wj=ac+wa>>1;
            if(val[i][wj].first<=t)ac=wj;
            else wa=wj;
        }
        return val[i][ac].second;
    }
};
struct persisitent_uf{
    hairetu par;
    hairetu ok;
    persisitent_uf(int n=0):par(n),ok(n){
        rep(i,n){
            par.push(i,-1,-1);
        }
    }
    int root(int a,int t){
        if(par.get(a,t)<0)return a;
        return root(par.get(a,t),t);
    }
    int same(int a,int b,int t){
        a=root(a,t),b=root(b,t);
        return a==b;
    }
    int merge(int a,int b,int t){
        a=root(a,t),b=root(b,t);
        if(a==b)return 0;
        if(-par.get(a,t)<-par.get(b,t))swap(a,b);
        ok.push(a,t,ok.get(a,t)||ok.get(b,t));
        par.push(a,t,par.get(a,t)+par.get(b,t));
        par.push(b,t,a);
        return 1;    
    }
};
int n,m;
vc<int>u,v,w;
persisitent_uf uf;
int deg[(int)1e6];
vc<int>W;
void solve(){
    uf=persisitent_uf(n);
    vc<int>idx(m);
    iota(all(idx),0);
    sort(all(idx),[&](int i,int j){
        return w[i]<w[j];
    });
    for(auto&i:idx)W.push_back(w[i]);
    int T=0;
    for(auto&i:idx){
        deg[u[i]]++;
        deg[v[i]]++;
        if(uf.merge(u[i],v[i],T)==0){
            dbg(u[i],v[i]);
            uf.ok.push(uf.root(u[i],T),T,1);
        }
        if(deg[u[i]]==3){
            uf.ok.push(uf.root(u[i],T),T,1);
        }
        if(deg[v[i]]==3){
            uf.ok.push(uf.root(v[i],T),T,1);
        }
        T++;
    }
}
int answer(int x,int y){
    int ac=m,wa=-1;
    while(ac-wa>1){
        int wj=ac+wa>>1;
        if(uf.same(x,y,wj)&&uf.ok.get(uf.root(x,wj),wj))ac=wj;
        else wa=wj;
    }
    if(ac==m)return -1;
    return W[ac];
}
void init(int N, int M,
          std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    n=N,m=M,u=U,v=V,w=W;
    solve();
}

int getMinimumFuelCapacity(int X, int Y) {
    return answer(X,Y);
  return 0;
}
namespace judge{
    void run(){
        #ifdef t9unkubj
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
        #endif
        int n,m;
        cin>>n>>m;
        vc<int>u(m),v(m),w(m);
        rep(i,m)cin>>u[i]>>v[i]>>w[i];
        init(n,m,u,v,w);
        
        int q;
        cin>>q;
        while(q--){
            int x,y;
            cin>>x>>y;
            dbg(getMinimumFuelCapacity(x,y));
        }
    }
};
//int main(){judge::run();}
#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...