結果
| 問題 |
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!!!