100分代码:
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int rea(){
int s=0;
char c=getchar();
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9') s=s*10+c-'0',c=getchar();
return s;
}
struct Edge{
int u,v;
}edge[600005];
int n,m,top,head[300005],pre[300005][20],d[300005],sum[300005][55],mod=998244353;
void add(int x,int y){
edge[++top].u=head[x];
edge[top].v=y;
head[x]=top;
}
void dfs(int x,int last){
for(int i=head[x];i;i=edge[i].u){
int to=edge[i].v;
if(to!=last){
d[to]=d[x]+1;
int tmp=1;
for(int j=1;j<=50;j++){
tmp=((ll)tmp*d[to])%mod;
sum[to][j]=((ll)tmp+sum[x][j])%mod;
}
pre[to][0]=x;
dfs(to,x);
}
}
}
void ST(){
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n;j++) pre[j][i]=pre[pre[j][i-1]][i-1];
}
int lca(int x,int y){
if(d[x]<d[y]) swap(x,y);
int dx=d[x],dy=d[y],k=0;
while((dy+(1<<k+1))<=dx) k++;
for(int i=k;i>=0;i--){
if((dx-(1<<i))>=dy) dx-=(1<<i),x=pre[x][i];
}
if(x==y) return x;
k=0;
while((1<<k+1)<=dx) k++;
for(int i=k;i>=0;i--){
if(pre[x][i]!=pre[y][i]) x=pre[x][i],y=pre[y][i];
}
return pre[x][0];
}
int main(){
n=rea();
for(int i=1;i<n;i++){
int x,y;
x=rea(); y=rea();
add(x,y); add(y,x);
}
m=rea();
dfs(1,1);
ST();
for(int i=1;i<=m;i++){
int x,y,k,ans;
x=rea(); y=rea(); k=rea();
int l=lca(x,y);
ans=(sum[x][k]+sum[y][k])%mod;
ans-=(sum[l][k]+sum[pre[l][0]][k])%mod;
cout<<(ans+mod)%mod<<'\n';
}
return 0;
}
10代码:
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int rea(){
int s=0;
char c=getchar();
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9') s=s*10+c-'0',c=getchar();
return s;
}
struct Edge{
int u,v;
}edge[600005];
int n,m,top,head[300005],pre[300005][20],d[300005][55],sum[300005][55],mod=998244353;
void add(int x,int y){
edge[++top].u=head[x];
edge[top].v=y;
head[x]=top;
}
void dfs(int x,int last){
for(int i=head[x];i;i=edge[i].u){
int to=edge[i].v;
if(to!=last){
d[to][1]=d[x][1]+1;
for(int j=2;j<=50;j++){
d[to][j]=((ll)d[to][j-1]*d[to][1])%mod;
sum[to][j]=((ll)d[to][j]+sum[x][j])%mod;
}
pre[to][0]=x;
dfs(to,x);
}
}
}
void ST(){
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n;j++) pre[j][i]=pre[pre[j][i-1]][i-1];
}
int lca(int x,int y){
if(d[x][1]<d[y][1]) swap(x,y);
int dx=d[x][1],dy=d[y][1],k=0;
while((dy+(1<<k+1))<=dx) k++;
for(int i=k;i>=0;i--){
if((dx-(1<<i))>=dy) dx-=(1<<i),x=pre[x][i];
}
if(x==y) return x;
k=0;
while((1<<k+1)<=dx) k++;
for(int i=k;i>=0;i--){
if(pre[x][i]!=pre[y][i]) x=pre[x][i],y=pre[y][i];
}
return pre[x][0];
}
int main(){
n=rea();
for(int i=1;i<n;i++){
int x,y;
x=rea(); y=rea();
add(x,y); add(y,x);
}
m=rea();
dfs(1,1);
ST();
for(int i=1;i<=m;i++){
int x,y,k,ans;
x=rea(); y=rea(); k=rea();
int l=lca(x,y);
ans=(sum[x][k]+sum[y][k])%mod;
ans-=(2*sum[l][k])%mod;
ans=(ans+d[l][k])%mod;
cout<<(ans+mod)%mod<<'\n';
}
return 0;
}
RT,我只改了记录深度的d数组和最后计算ans的方法,貌似没有不同,为什么会有这么大的差异?卡了我几个小时