結果

問題 No.529 帰省ラッシュ
ユーザー blackyukiblackyuki
提出日時 2021-03-14 16:43:22
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 588 ms / 4,500 ms
コード長 4,827 bytes
コンパイル時間 2,762 ms
コンパイル使用メモリ 221,508 KB
実行使用メモリ 48,384 KB
最終ジャッジ日時 2024-04-24 00:02:36
合計ジャッジ時間 11,340 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 9 ms
5,376 KB
testcase_05 AC 8 ms
5,376 KB
testcase_06 AC 8 ms
5,376 KB
testcase_07 AC 9 ms
5,376 KB
testcase_08 AC 516 ms
24,448 KB
testcase_09 AC 500 ms
24,576 KB
testcase_10 AC 497 ms
33,080 KB
testcase_11 AC 501 ms
33,408 KB
testcase_12 AC 394 ms
22,272 KB
testcase_13 AC 364 ms
48,384 KB
testcase_14 AC 516 ms
28,032 KB
testcase_15 AC 582 ms
36,992 KB
testcase_16 AC 588 ms
36,864 KB
testcase_17 AC 560 ms
45,056 KB
testcase_18 AC 536 ms
45,312 KB
testcase_19 AC 552 ms
42,880 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> PP;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<bool> vb;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,k,n) for(ll i=(ll)(k);i<(ll)(n);i++)
#define fi first
#define se second
#define all(a) a.begin(),a.end()
#define rosrt(a) {sort(all(a));reverse(all(a));}
#define dupli(a) {sort(all(a));a.erase(unique(all(a)),a.end());}
#define lb(v,k) (lower_bound(all(v),k)-v.begin())
#define pb emplace_back
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<class T> void out(T a){cout<<a<<'\n';}
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];};cout<<'\n';}
template<class T> void outvv(T v){for(auto x:v)outv(x);}
template<class T> void outp(T p){cout<<'('<<p.fi<<','<<p.se<<')'<<endl;}
template<class T> void outvp(T v){for(auto x:v)cout<<'('<<x.fi<<','<<x.se<<')';cout<<endl;}
#define PQ(a) priority_queue<a>
class segtree{
    ll N=1;
    P g=P(-1,-1);
    vector<PQ(ll)> v;
    vp seg;
    P f(P a,P b){return max(a,b);}
public:
    segtree(ll n){
        while(N<n)N*=2;
        seg=vp(N*2-1,g);
        rep(i,n)seg[i+N-1].se=i;
        v=vector<PQ(ll)>(n);
    }
    void add(ll i,ll x){
        v[i].push(x);
        seg[i+N-1].fi=v[i].top();
        i+=N-1;
        while(i>0){
            i=(i-1)/2;
            seg[i]=f(seg[i*2+1],seg[i*2+2]);
        }
    }
    void er(ll i){
        v[i].pop();
        if(v[i].size())seg[i+N-1].fi=v[i].top();
        else seg[i+N-1].fi=-1;
        i+=N-1;
        while(i>0){
            i=(i-1)/2;
            seg[i]=f(seg[i*2+1],seg[i*2+2]);
        }
    }
    P get(ll a,ll b){
        P res=P(-1,-1);
        a+=N-1;b+=N-1;
        while(a<b){
            if(!(a&1))chmax(res,seg[a]);
            if(!(b&1))chmax(res,seg[b-1]);
            a=a>>1;b=(b-1)>>1;
        }
        return res;
    }
};
int main(){
    ll n,m,q;cin>>n>>m>>q;
    vvp g(n);
    rep(i,m){
        ll a,b;cin>>a>>b;
        a--;b--;
        g[a].pb(b,i);g[b].pb(a,i);
    }
    vi lk(n),dep(n,-1);
    function<void(ll,ll)> dfs=[&](ll i,ll p){
        lk[i]=dep[i];
        for(auto x:g[i])if(x.fi!=p){
            if(dep[x.fi]==-1){
                dep[x.fi]=dep[i]+1;
                dfs(x.fi,i);
                chmin(lk[i],lk[x.fi]);
            }
            else{
                chmin(lk[i],dep[x.fi]);
            }
        }
    };dep[0]=0;dfs(0,-1);
    vb is_bridge(m,false);
    function<void(ll,ll)> dfs2=[&](ll i,ll e){
        if(e!=-1&&lk[i]==dep[i])is_bridge[e]=true;
        for(auto x:g[i])if(dep[x.fi]==dep[i]+1)dfs2(x.fi,x.se);
    };dfs2(0,-1);
    ll cmp=0;
    vi gr(n,-1);
    function<void(ll)> dfs3=[&](ll i){
        for(auto x:g[i])if(!is_bridge[x.se]&&gr[x.fi]==-1){
            gr[x.fi]=gr[i];dfs3(x.fi);
        }
    };rep(i,n)if(gr[i]==-1){gr[i]=cmp++;dfs3(i);}
    vvi tree(cmp);
    rep(i,n)for(auto x:g[i])if(is_bridge[x.se]){
        tree[gr[i]].pb(gr[x.fi]);
    }
    n=cmp;
    vvi G=tree;
    vi sub(n);
    function<void(ll,ll)> initHLD=[&](ll i,ll p){
        sub[i]=1;
        ll ma=0;
        rep(j,G[i].size())if(G[i][j]!=p){
            initHLD(G[i][j],i);
            sub[i]+=sub[G[i][j]];
            if(chmax(ma,sub[G[i][j]]))swap(G[i][j],G[i][0]);
        }
    };initHLD(0,-1);
    vi head(n),par(n);
    function<void(ll,ll)> initHLD2=[&](ll i,ll p){
        par[i]=p;
        rep(j,G[i].size())if(G[i][j]!=p){
            if(j==0)head[G[i][j]]=head[i];
            else head[G[i][j]]=G[i][j];
            initHLD2(G[i][j],i);
        }
    };head[0]=0;initHLD2(0,-1);
    vi euler(n);
    ll c=0;
    function<void(ll)> tour=[&](ll i){
        euler[i]=c++;
        for(ll x:G[i])if(x!=par[i])tour(x);
    };tour(0);
    auto lca=[&](ll a,ll b){
        while(head[a]!=head[b]){
            if(dep[head[a]]<dep[head[b]])swap(a,b);
            a=par[head[a]];
        }
        if(dep[a]>dep[b])return b;
        return a;
    };
    P res;
    segtree seg(n);
    auto do_path=[&](ll a,ll b){
        while(head[a]!=head[b]){
            if(dep[head[a]]<dep[head[b]])swap(a,b);
            chmax(res,seg.get(euler[head[a]],euler[a]+1));
            a=par[head[a]];
        }
        chmax(res,seg.get(min(euler[a],euler[b]),max(euler[a],euler[b])+1));
    };
    // outv(euler);
    rep(i,q){
        ll t;cin>>t;
        if(t==1){
            ll a,b;cin>>a>>b;
            a=gr[a-1];
            seg.add(euler[a],b);
        }
        else{
            ll a,b;cin>>a>>b;
            res=P(-1,-1);
            do_path(gr[a-1],gr[b-1]);
            out(res.fi);
            if(res.fi!=-1)seg.er(res.se);
        }
    }
}
0