这题原先的代码我是这样写的
#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帮忙看看吗