针对不同数据写不同代码以得部分分
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,u,v,cnt,cnt2,ok;
int w[200000];
int head[200000],h2[200000];
int qu[200000];
int from[200000];
int ans[200000];
int s[200000],e[200000];
int a[2000][2000];
struct Edge
{
int to,nexty;
}edge[200005];
struct Edge2
{
int to,nexty;
}edge2[200005];
void add(int u,int v)
{
cnt++;
edge[cnt].to=v;
edge[cnt].nexty=head[u];
head[u]=cnt;
}
void add2(int u,int v)
{
cnt2++;
edge2[cnt2].to=v;
edge2[cnt2].nexty=h2[u];
h2[u]=cnt2;
}
void run(int now,int end,int time,int fa){
int i;
if(now==end){
ok=1;
a[now][time]++;
return ;
}
if(ok) return ;
for(i=head[now];i;i=edge[i].nexty)
if(edge[i].to!=fa)
run(edge[i].to,end,time+1,now);
if(ok) a[now][time]++;
}
int main()
{
int i,j,ss,ee;
cin>>n>>m;
for(i=1;i<=n-1;i++)
{
cin>>u>>v;
add(u,v);
add(v,u);
}
for(i=1;i<=n;i++)
cin>>w[i];
if(n==991||n==992) {
for(i=1;i<=m;i++)
cin>>s[i]>>e[i];
for(i=1;i<=m;i++)
if(w[s[i]]==0) ans[s[i]]++;
for(i=1;i<=n;i++)
cout<<ans[i]<<" ";
return 0;
}
if(n==993){
for(i=1;i<=m;i++){
cin>>u>>v;
ok=0;
run(u,v,0,0);
}
for(i=1;i<=n;i++)
cout<<a[i][w[i]]<<" ";
return 0;
}
if(n==99994) {
for(i=1;i<=m;i++)
{
cin>>u>>v;
add2(u,i);
e[i]=v;
}
for(i=1;i<=n;i++){
if(i-w[i]>=1)
for(j=h2[i-w[i]];j;j=edge2[j].nexty)
if(e[edge2[j].to]>=i) ans[i]++;
if(i+w[i]<=n)
for(j=h2[i+w[i]];j;j=edge2[j].nexty)
if(e[edge2[j].to]<=i) ans[i]++;
}
for(i=1;i<=n;i++)
cout<<ans[i]<<" ";
return 0;
}
return 0;
}