关注
之前代码好像粘贴的时候挂了,现在重发一下 #include<bits/stdc++.h>
#define ll long long
using namespace std;
struct Node{
int Dep,Id;
}St[100010][20];
bool operator <(Node a,Node b){
return a.Dep<b.Dep;
}
int L,Lca,Now,p,q,Ans,x,Cnt,n,m,y,z,Num,Tot,Reduce;
int Sum[10010],Head[10010],Next[10010],To[10010],Point[10010],Edge[10010],Fa[10010],Dep[10010],First[10010],From[10010];
template<typename T>
inline int Read(T &x) {
x=0;
ll f=1;
char c=getchar();
while(!isdigit(c)) {
if(c=='-') {
f=-f;
}
c=getchar();
}
while(isdigit(c)) {
x=x*10+c-'0';
c=getchar();
}
x*=f;
if(c=='\n') {
return 1;
} else {
return 0;
}
}
void Write(int x) {
if(x<0) {
x=-x;
putchar('-');
}
if(x>9) {
Write(x/10);
}
putchar(x%10+'0');
}
inline void Add(int x,int y){
To[++Cnt]=y;
Next[Cnt]=Head[x];
Head[x]=Cnt;
To[++Cnt]=x;
Next[Cnt]=Head[y];
Head[y]=Cnt;
}
inline void Dfs1(int x,int f){
int y;
Fa[x]=f;
Dep[x]=Dep[f]+1;
St[++Num][0].Dep=Dep[x];
St[Num][0].Id=x;
First[x]=Num;
for(int i=Head[x];i;i=Next[i]){
y=To[i];
if(y==f){
continue;
}
From[y]=i;
Dfs1(y,x);
St[++Num][0].Dep=Dep[x];
St[Num][0].Id=x;
}
}
inline int Query(int x,int y){
Node Res;
if(First[x]>First[y]){
swap(x,y);
}
int k=log2(First[y]-First[x]+1);
Res=min(St[First[x]][k],St[First[y]-(1<<k)][k]);
return Res.Id;
}
inline int Dfs2(int x,int f,int Dep){
int y,z,Sum;
if(Dep==p){
Point[Query(x,Now)]++;
return 1;
}
for(int i=Head[x];i;i=Next[i]){
y=To[i];
if(To[i]==f){
continue;
}
z=Dfs2(y,x,Dep+1);
if(z){
Edge[y]+=z;
Edge[y^1]+=z;
Sum+=z;
}
}
return Sum;
}
inline void Dfs3(int x,int f){
int y;
Sum[x]=Point[x]+Sum[f];
for(int i=Head[x];i;i=Next[i]){
y=To[i];
if(y==f){
continue;
}
Dfs3(y,x);
}
}
int main(){
Cnt=1;
Read(n);
Read(p);
Read(q);
for(int i=1;i<n;i++){
Read(x);
Read(y);
Add(x,y);
}
Dep[0]=0;
Dfs1(1,0);
for(int i=1;i<=19;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
St[j][i]=min(St[j][i-1],St[j+(1<<(i-1))][i-1]);
}
}
for(int i=1;i<=n;i++){
Now=i;
Dfs2(i,0,0);
}
for(int i=1;i<=n;i++){
Point[i]/=2;
Tot+=Point[i];
}
for(int i=1;i<=Cnt;i++){
Edge[i]/=2;
}
Dfs3(1,0);
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
Lca=Query(i,j);
L=Dep[i]+Dep[j]-Dep[Lca]*2;
if(L!=q){
continue;
}
Reduce=Sum[i]+Sum[j]-Sum[Lca]*2+Point[Lca]+Edge[From[Lca]];
Ans+=(Tot-Reduce);
}
}
Write(Ans);
return 0;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
814292次浏览 12971人参与
# 机械制造薪资爆料 #
319273次浏览 3727人参与
# 晒一晒我的offer #
3459059次浏览 55180人参与
# 0offer是寒冬太冷还是我太菜 #
426715次浏览 4921人参与
# 荣耀求职进展汇总 #
70049次浏览 709人参与
# 如果可以选,你最想从事什么工作 #
185552次浏览 3069人参与
# 实习生应该准时下班吗 #
80517次浏览 591人参与
# 海康威视求职进展汇总 #
101112次浏览 1213人参与
# 实习必须要去大厂吗? #
13660次浏览 218人参与
# 软件开发投递记录 #
478619次浏览 7239人参与
# 宁德时代求职进展汇总 #
36954次浏览 412人参与
# 你觉得找工作该拿大厂还是小厂练手 #
61242次浏览 868人参与
# 国企vs私企,你更想去? #
20219次浏览 204人参与
# 求职遇到的搞笑事件 #
19575次浏览 286人参与
# 滴!实习打卡 #
215845次浏览 3642人参与
# 实习工作,你找得还顺利吗? #
42055次浏览 466人参与
# 想实习转正,又想准备秋招,我该怎么办 #
117227次浏览 1318人参与
# 金三银四,你有感觉到吗 #
328246次浏览 4210人参与
# 你的秋招进行到哪一步了 #
367708次浏览 6393人参与
# 你觉得今年秋招难吗 #
310855次浏览 5789人参与