#17 TLE
查看原帖
#17 TLE
239163
MarchKid_Joe楼主2022/8/10 08:59

开始用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;
}
2022/8/10 08:59
加载中...