結果
問題 |
No.2337 Equidistant
|
ユーザー |
|
提出日時 | 2024-10-06 20:39:50 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 428 ms / 4,000 ms |
コード長 | 1,784 bytes |
コンパイル時間 | 1,512 ms |
コンパイル使用メモリ | 172,352 KB |
実行使用メモリ | 51,568 KB |
最終ジャッジ日時 | 2024-10-06 20:40:02 |
合計ジャッジ時間 | 9,207 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 28 |
ソースコード
bool M1; #define look_memory cerr<<abs(&M2-&M1)/1024.0/1024<<" MB\n" #define look_time cerr<<(clock()-Time)*1.0/CLOCKS_PER_SEC<<'\n' #include<bits/stdc++.h> #include<ctime> int _=1; using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PII; #define pb push_back #define fi first #define se second #define rd read() #define Debug(x) (cerr<<x<<endl) inline ll read(){ ll num=0,sign=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-'){sign=-1;}ch=getchar();} while(isdigit(ch)) num=(num<<1)+(num<<3)+ch-'0',ch=getchar(); return num*sign; } const int N=3e5+10; int n,q,dep[N],sz[N],fa[N][20]; vector <int> G[N]; void dfs(int u,int par){ dep[u]=dep[par]+1,fa[u][0]=par,sz[u]=1; for(int i=1;i<20;i++) fa[u][i]=fa[fa[u][i-1]][i-1]; for(int v:G[u]) if(v^par) dfs(v,u),sz[u]+=sz[v]; } int LCA(int u,int v){ if(dep[u]<dep[v]) swap(u,v); for(int i=19;~i;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i]; if(u==v) return u; for(int i=19;~i;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i]; return fa[u][0]; } int up(int u,int x){ for(int i=19;~i;i--) if(x>>i&1) u=fa[u][i]; return u; } int solve(int u,int v){ if(dep[u]<dep[v]) swap(u,v); int lca=LCA(u,v),t=dep[u]+dep[v]-dep[lca]*2; if(t&1) return 0; else{ if(dep[u]==dep[v]) return n-sz[up(u,(t>>1)-1)]-sz[up(v,(t>>1)-1)]; else return sz[up(u,t>>1)]-sz[up(u,(t>>1)-1)]; } } void Main(){ n=rd,q=rd; for(int i=1,u,v;i<n;i++) u=rd,v=rd,G[u].pb(v),G[v].pb(u); dfs(1,0); while(q--){ int k=2,x=rd,y; if(k==1) printf("%d\n",n); else{ y=rd,printf("%d\n",solve(x,y)); } } } bool M2; signed main(){ // freopen("in.txt","r",stdin); int Time=clock(); look_memory; // _=rd; while(_--) Main(); look_time; } //pay attention to size of array!!!