树剖代码求助
查看原帖
树剖代码求助
437368
J2a0m0e8s楼主2022/7/21 14:06

这个代码只有7575分,求助哪里写错了

#include<bits/stdc++.h>
using namespace std;
int dep[100009],cnt,re[100009],up[100009],k[100009],n,m,siz[100009],son[100009],f[100009];
struct data{
	int x,y,z;
}a[100009];
struct chg{
	int typ,num;
};
struct t{
	int ma,num;
}tr[400009];
int p[100009],s[100009],ans[100009],to[100009],xcnt;
vector<int>e[100009];
vector<chg>g[100009];
void dfs(int x,int fa){
	f[x]=fa,siz[x]=1,dep[x]=dep[fa]+1;
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		if(y==fa)continue;
		dfs(y,x);
		siz[x]+=siz[y];
		if(siz[y]>siz[son[x]])son[x]=y;
	}
	return ;
}
void dfs2(int x,int top){
	k[x]=++cnt,re[cnt]=x,up[x]=top;
	if(son[x]==0)return ;
	dfs2(son[x],top);
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		if(y==f[x]||y==son[x])continue;
		dfs2(y,y);
	}
	return ;
}
void modix(int u,int v,int t){
	while(up[u]!=up[v]){
		if(dep[up[u]]<dep[up[v]])swap(u,v);
		g[k[u]+1].push_back({t,-1});
		g[k[up[u]]].push_back({t,1});
		u=f[up[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	g[k[v]+1].push_back({t,-1});
	g[k[u]].push_back({t,1});
	return ;
}
void build(int rt,int l,int r){
	if(l==r){tr[rt].ma=++xcnt,to[xcnt]=l;return ;}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	tr[rt].ma=tr[rt<<1].ma;
}
void modify(int rt,int l,int r,int dis,int k){
	if(l==r){tr[rt].num+=k;return ;}
	int mid=(l+r)>>1;
	if(dis<=mid)modify(rt<<1,l,mid,dis,k);
	else modify(rt<<1|1,mid+1,r,dis,k);
	if(tr[rt<<1].num>=tr[rt<<1|1].num)tr[rt].ma=tr[rt<<1].ma,tr[rt].num=tr[rt<<1].num;
	else tr[rt].ma=tr[rt<<1|1].ma,tr[rt].num=tr[rt<<1|1].num;
	return ;
}
inline int read(){
	int f=1,r=0;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=0;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		r=(r<<3)+(r<<1)+(c&15);
		c=getchar();
	}
	return f?r:-r;
}
int main()
{
	ios::sync_with_stdio(false);
	n=read(),m=read();
	for(int i=1;i<n;i++){
		int x,y;
		x=read(),y=read();
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	dfs2(1,1);
	for(int i=1;i<=m;i++){
		a[i].x=read(),a[i].y=read(),a[i].z=read();
		p[i]=a[i].z;
	}
	sort(p+1,p+n+1);
	for(int i=1;i<=m;i++){
		int tem=a[i].z;
	    a[i].z=lower_bound(p+1,p+n+1,a[i].z)-p;
	    s[a[i].z]=tem;
	}
	for(int i=1;i<=m;i++)modix(a[i].x,a[i].y,a[i].z);
	build(1,1,n);
    for(int i=1;i<=n;i++){
	    for(int j=0;j<g[i].size();j++)modify(1,1,n,to[g[i][j].typ],g[i][j].num);
	    ans[i]=(tr[1].num==0)?0:tr[1].ma;
	}
	for(int i=1;i<=n;i++)cout<<s[ans[k[i]]]<<endl;
    return 0;
}
2022/7/21 14:06
加载中...