AC了,但是好怪...
查看原帖
AC了,但是好怪...
786957
YDHJ楼主2023/8/19 08:02

这题原先的代码我是这样写的

#include<bits/stdc++.h>
#define maxl 18
#define maxm 2000010
#define maxn 1000010
#define inf 20080531
using namespace std;
struct EDGE
{
	int v;
	int nxt;
}edge[maxm];
int head[maxn],totedge=1;
void addedge(int u,int v)
{
	totedge++;
	edge[totedge].v=v;
	edge[totedge].nxt=head[u];
	head[u]=totedge;
}
int n,m;
int rt[maxn];
struct TREE
{
	int dep;
	int anc[20];
}tree[maxn];
void ldfs(int p)
{
	for(int i=head[p];i;i=edge[i].nxt)
	{
		int v=edge[i].v;
		if(v==tree[p].anc[0])
			continue;
		tree[v].anc[0]=p;
		tree[v].dep=tree[p].dep+1;
		ldfs(v);
	}
}
void init()
{
	for(int j=1;j<=maxl;++j)
		for(int i=1;i<=n;++i)
			tree[i].anc[j]=tree[tree[i].anc[j-1]].anc[j-1];
}
int lca(int u,int v)
{
	if(tree[u].dep<tree[v].dep)
		swap(u,v);
	for(int i=maxl;i>=0;i--)
		if(tree[tree[u].anc[i]].dep>=tree[v].dep)
			u=tree[u].anc[i];
	if(u==v)
		return u;
	for(int i=maxl;i>=0;i--)
		if(tree[u].anc[i]!=tree[v].anc[i])
			u=tree[u].anc[i],v=tree[v].anc[i];
	return tree[u].anc[0];
}
struct SGT
{
	int lc,rc;
	pair<int,int>dat;
}sgt[maxn<<4];
int totnode;
void pushup(int p)
{
	if(!sgt[p].lc)sgt[p].lc=++totnode;
	if(!sgt[p].rc)sgt[p].rc=++totnode;
	if(sgt[sgt[p].lc].dat.first>sgt[sgt[p].rc].dat.first)
		sgt[p].dat.second=sgt[sgt[p].lc].dat.second,
		sgt[p].dat.first=sgt[sgt[p].lc].dat.first;
	else if(sgt[sgt[p].lc].dat.first==sgt[sgt[p].rc].dat.first)
	{
		if(sgt[sgt[p].lc].dat.second<sgt[sgt[p].rc].dat.second)
			sgt[p].dat.second=sgt[sgt[p].lc].dat.second,
			sgt[p].dat.first=sgt[sgt[p].lc].dat.first;
        else
	        sgt[p].dat.second=sgt[sgt[p].rc].dat.second,
			sgt[p].dat.first=sgt[sgt[p].rc].dat.first;
	}
	else
		sgt[p].dat.second=sgt[sgt[p].rc].dat.second,
		sgt[p].dat.first=sgt[sgt[p].rc].dat.first;
}
void modify(int &p,int tl,int tr,int x,int d)
{
	if(!p)p=++totnode;
	if(tl==tr)
	{
		sgt[p].dat.first+=d;
		sgt[p].dat.second=x;
		return ;
	}
	int mid=tl+tr>>1;
	if(x<=mid)
		modify(sgt[p].lc,tl,mid,x,d);
	else modify(sgt[p].rc,mid+1,tr,x,d);
	pushup(p);
}
void merge(int &x,int y,int l=1,int r=maxn)
{
	if(!x||!y)
		x|=y;
	else
	{
		if(l==r)
			sgt[x].dat.first+=sgt[y].dat.first;
		else
		{
			int mid=l+r>>1;
			merge(sgt[x].lc,sgt[y].lc,l,mid);
			merge(sgt[x].rc,sgt[y].rc,mid+1,r);
			pushup(x);
		}
	}
}
int ans[maxn];
void dfs(int p)
{
	for(int i=head[p];i;i=edge[i].nxt)
	{
		int v=edge[i].v;
		if(v==tree[p].anc[0])
			continue;
		dfs(v);
		merge(rt[p],rt[v]);
 	}
	if(sgt[rt[p]].dat.first)
		ans[p]=sgt[rt[p]].dat.second;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		addedge(u,v);
		addedge(v,u);
	}
	tree[1].dep=1;
	ldfs(1);
	init();
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		modify(rt[x],1,maxn,z,1);
		modify(rt[y],1,maxn,z,1);
		int tmp=lca(x,y);
		modify(rt[tmp],1,maxn,z,-1);
		modify(rt[tree[tmp].anc[0]],1,maxn,z,-1);
	}
	dfs(1);
	for(int i=1;i<=n;i++)
		cout<<ans[i]<<"\n";
	return 0;
}

结果只有80分。

然后我就试着把pushup函数里面的

if(!sgt[p].lc)sgt[p].lc=++totnode;
if(!sgt[p].rc)sgt[p].rc=++totnode;

给去掉了,结果就过了

但是不能理解是什么原因啊。。。

有dalao帮忙看看吗

2023/8/19 08:02
加载中...