제출 #1201439

#제출 시각아이디문제언어결과실행 시간메모리
1201439vnedu도로 개발 (JOI15_road_development)C++17
100 / 100
156 ms26972 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10; const int LG = 20; const int maxQuery = 3e5 + 10; int numNode,numQuery,st[N],en[N],tg=0; struct Query { int u,v,type; Query() {} void input() { cin>>type>>u>>v; } } query[maxQuery]; struct Bit { int bit[2*N]; Bit() {} void add(int x, int val) { while(x<=tg) { bit[x]+=val; x+=x&-x; } } int get(int x) { int ans=0; while(x>=1) { ans+=bit[x]; x-=x&-x; } return ans; } } bit; struct Dsu { int n,par[N]; Dsu() {} void init(int _n) { n=_n; for(int i=1;i<=n;++i) par[i]=i; } int get(int x) { if(x==par[x]) return x; return par[x]=get(par[x]); } bool unite(int u, int v) { int s=get(u),t=get(v); if(s==t) return 0; par[s]=t; return 1; } } dsu1,dsu2; vector<int> adj[N]; bool vis[N]; int up[N][LG],dep[N]; void dfs(int u, int pa) { st[u]=++tg; vis[u]=1; up[u][0]=pa; for(int j=1;j<LG;++j) if((1<<j)<dep[u]) up[u][j]=up[up[u][j-1]][j-1]; for(int v : adj[u]) if(!vis[v]) { dep[v]=dep[u]+1; dfs(v,u); } en[u]=++tg; } int findLca(int u, int v) { if(dep[u]<dep[v]) swap(u,v); int k=dep[u]-dep[v]; for(int j=0;j<LG;++j) if((k>>j)&1) u=up[u][j]; if(u==v) return u; for(int j=LG-1;j>=0;--j) if((1<<j)<dep[u]) { if(up[u][j]!=up[v][j]) { u=up[u][j]; v=up[v][j]; } } return up[u][0]; } void solve() { cin>>numNode>>numQuery; dsu1.init(numNode); for(int i=1;i<=numQuery;++i) { query[i].input(); if(query[i].type==1) { if(dsu1.unite(query[i].u,query[i].v)) { adj[query[i].u].push_back(query[i].v); adj[query[i].v].push_back(query[i].u); } } } dsu1.init(numNode); dsu2.init(numNode); for(int i=1;i<=numNode;++i) if(!vis[i]) { dep[i]=1; dfs(i,-1); } for(int i=1;i<=numNode;++i) if(dep[i]!=1) { bit.add(st[i],1); bit.add(en[i]+1,-1); } for(int i=1;i<=numQuery;++i) { int u=query[i].u; int v=query[i].v; int type=query[i].type; if(type==1) { if(!dsu1.unite(u,v)) { int lca=findLca(u,v); while(1) { int cur=dsu2.get(u); if(dep[cur]<=dep[lca]) break; dsu2.par[cur]=dsu2.get(up[cur][0]); bit.add(st[cur],-1); bit.add(en[cur]+1,1); } while(1) { int cur=dsu2.get(v); if(dep[cur]<=dep[lca]) break; dsu2.par[cur]=dsu2.get(up[cur][0]); bit.add(st[cur],-1); bit.add(en[cur]+1,1); } } } else { // cout<<type<<' '<<u<<' '<<v<<'\n'; if(dsu1.get(u)!=dsu1.get(v)) cout<<-1<<'\n'; else { int lca=findLca(u,v); cout<<bit.get(st[u])+bit.get(st[v])-2*bit.get(st[lca])<<'\n'; } } } } int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int testcase=1; // cin>>testcase; while(testcase--) solve(); return 0; }
#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...