TLE就是很慢,
查看原帖
TLE就是很慢,
327139
纯白楼主2021/7/17 21:41
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=500000;
int nex[maxn];
int v[maxn];
int hd[maxn],ct;
int n,b,a;
int col[maxn],ans[maxn],cnt[maxn],fa[maxn],bs[maxn],sz[maxn];
int size;
int num,sum;
int son;

inline void read(int &x)
{
	x = 0;int f = 1;
	char ch = getchar();
	while(!isdigit(ch)){if(ch == '-')f = -1; ch = getchar();}
	while(isdigit(ch)){x = (x<<3) + (x<<1) + ch - '0'; ch = getchar();}
	x = x*f;
} 
void add(int from, int to)
{
	v[++ct]=to;
	nex[ct]=hd[from];
	hd[from]=ct;
}

void dfs1(int nw, int en)
{
	fa[nw]=en;
	sz[nw]=1;
	size=-1;
	for (int i=hd[nw]; i; i=nex[i])
	{
		int to=v[i];
		if (to==en) continue;
		dfs1(to,nw);
		sz[nw]+=sz[to];
		if (sz[to] > size)
			{
				size=sz[to];
				bs[nw]=to;
			}
	}
	
}
inline void calu(int u,int val)
{
 	cnt[col[u]]+=val;
	if (cnt[col[u]] > num )
		{
			num=cnt[col[u]] ;
			sum=col[u];
		}
	else if (cnt[col[u]]==num)
			sum+=col[u];
	for (int i=hd[u]; i; i=nex[i])
	{
		int to=v[i];
		if (to==fa[u] || to==son)
			continue;
		calu(to,val);
	}
}
void dfs2(int u,int val)
{
	for (int i=hd[u]; i; i=nex[i])
	{
		int to=v[i];
		if (to==fa[u] || to==bs[u]) continue;
		dfs2(to,0);
	}
	if (bs[u]) dfs2(bs[u],1),son=bs[u];
	calu(u,1);
	ans[u]=sum;
	son=0;
	if (!val)
	{
		calu(u,-1);
		num=0;
		sum=0;
	} 
}

int main ()
{
	cin >> n;
	for (int i=1;i<=n;i++)
		read(col[i]);
	for (int i=1;i<n;i++)
	{
		read(a);
		read(b);
		add(a,b);
		add(b,a); 
	}
	dfs1(1,0);
	dfs2(1,0);
	for (int i=1;i<=n;i++)
		printf("%d ",ans[i]);
	return 0;
	
}

已经照着题解改了,,,,但,,,

哪里是不是写错了啊?

快把孩子逼疯了,一晚上就写了个tle

2021/7/17 21:41
加载中...