为啥#define int long long会re
查看原帖
为啥#define int long long会re
524994
Ptilopsis_楼主2024/8/3 21:30

rt,现在这个是AC代码,但是无法理解为什么

#define int long long 

会re

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+2;
int id[N];
struct query
{
	int l,r,idx;
	friend bool operator < (query a,query b)
	{
		return id[a.l]==id[b.l]?a.r<b.r:id[a.l]<id[b.l];
	}
}q[N];
int n,m,a[N],b[N],c[N],dfn[N],cnt,mx;
ll sum[N],ans[N];
vector<int> mp[N];
void dfs(int u,int f)
{
	dfn[u]=++cnt;
	b[cnt]=a[u];
	q[u].l=cnt,q[u].idx=u;
	for(int i=0;i<mp[u].size();i++)
	{
		int v=mp[u][i];
		if(v==f)
			continue;
		dfs(v,u);
	}
	q[u].r=cnt;
}
void add(int x)
{
	x=b[x];
	sum[c[x]]-=x;
	c[x]++;
	sum[c[x]]+=x;
	if(c[x]>mx)
		mx++;
}
void del(int x)
{
	x=b[x];
	sum[c[x]]-=x;
	c[x]--;
	sum[c[x]]+=x;
	if(!sum[c[x]+1]&&c[x]+1==mx)
		mx--;
}
signed main()
{
	scanf("%d",&n);
	m=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		id[i]=(i-1)/m+1;
	}
	int u,v;
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&u,&v);
		mp[u].push_back(v);
		mp[v].push_back(u);
	}
	dfs(1,0);
	sort(q+1,q+1+n);
	int l=1,r=0;
	for(int i=1;i<=n;i++)
	{
		int L=q[i].l,R=q[i].r;
		while(l>L)
			add(--l);
		while(r<R)
			add(++r);
		while(l<L)
			del(l++);
		while(r>R)
			del(r--);
		ans[q[i].idx]=sum[mx];
	}	
	for(int i=1;i<=n;i++)
		cout<<ans[i]<<" ";	
}
2024/8/3 21:30
加载中...