开始用sort处理T掉了,现在用桶排还是T掉了。。。 什么优化? Who can help me?
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
template <typename Type> void read(Type &n)
{
Type w=1;char x=getchar();n=0;
while(x<'0'||x>'9'){if(x=='-')w=-1;x=getchar();}
while(x>='0'&&x<='9'){n=(n<<1)+(n<<3)+(x^48);x=getchar();}
n*=w;
}
template <typename Type,typename...Etc> void read(Type &n,Etc &...etcs)
{
read(n);read(etcs...);
}
template <typename Type> void write(Type x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
}
using namespace IO;
int n,k;
const int SIZE=(5e4+10);
int head[SIZE];
int size[SIZE];
int maxn[SIZE];
int bin[510];
int ecnt;
int root;
int total;
int ANS;
bool vis[SIZE];
struct edge
{
int v;
int nxt;
};
edge e[SIZE<<1];
int get_root(int u,int f)
{
size[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!vis[v]&&v!=f)
{
size[u]+=get_root(v,u);
maxn[u]=max(maxn[u],size[v]);
}
}
maxn[u]=max(maxn[u],total-size[u]);
if(maxn[u]<maxn[root])
root=u;
return size[u];
}
void get_dis(int u,int f,int d)
{
if(d>k) return ;
bin[d]++;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!vis[v]&&v!=f)
get_dis(v,u,d+1);
}
}
int get_ans(int u,int d)
{
memset(bin,0,sizeof(bin));
int ans=0;
get_dis(u,u,d);
for(int i=0;i<=k;i++)
{
if(i>=k-i) break;
ans+=bin[i]*bin[k-i];
}
if(!(k&1))
ans+=(bin[k>>1]*(bin[k>>1]-1)>>1);
return ans;
}
void dfs(int u)
{
vis[u]=true;
ANS+=get_ans(u,0);
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!vis[v])
{
root=0;
total=size[v];
get_root(v,u);
ANS-=get_ans(v,1);
dfs(root);
}
}
}
void add(int u,int v)
{
e[++ecnt]={v,head[u]};
head[u]=ecnt;
e[++ecnt]={u,head[v]};
head[v]=ecnt;
}
int main()
{
read(n,k);
for(int i=1,u,v;i<n;i++)
{
read(u,v);
add(u,v);
}
root=0;
total=n;
maxn[root]=(SIZE);
get_root(1,1);
dfs(root);
write(ANS);
return 0;
}