线段树合并板子25ptsWA求调
查看原帖
线段树合并板子25ptsWA求调
542128
liyixin0514楼主2024/10/9 14:06

rt,MnZn 刚学线段树合并,求调qwq

#include<bits/stdc++.h>
// #define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=1e5+7;
int n,m,u,v,z;
struct edge {
	int to,ne;
}e[N<<1];
int head[N],cnt;
inline void addedge(int u,int v) {e[++cnt]={v,head[u]}, head[u]=cnt; }
struct node{
	node (int _l,int _r) :l(_l),r(_r),mx(0),mxid(0),ls(nullptr),rs(nullptr){}
	int l,r,mx,mxid;
	node *ls,*rs;
	inline int getmid() { return (l+r)>>1; }
	inline void pushup() {
		mx=0,mxid=0;
		if(ls!=nullptr) if(ls->mx>mx) mx=ls->mx,mxid=ls->mxid;
		if(rs!=nullptr) if(rs->mx>mx) mx=rs->mx,mxid=rs->mxid;
	}
};
vector<int> tag[N];
int dfn[N];
int st[N][20];
int fa[N];
void dfs(int u,int f) {
	fa[u]=f;
	dfn[u]=++dfn[0];
	st[dfn[0]][0]=f;
	for(int i=head[u];i;i=e[i].ne) {
		int v=e[i].to;
		if(v==f) continue;
		dfs(v,u);
	}
}
inline int _min(int l,int r) { return dfn[l]<dfn[r]?l:r; }
void init() {
	int lg=__lg(n);
	rep(k,1,lg) {
		for(int i=1;i+(1<<k)-1<=n;i++) {
			st[i][k]=_min(st[i][k-1],st[i+(1<<(k-1))][k-1]);
		}
	}
}
inline void getlca(int u,int v,int z) {
	if(u==v) {
		tag[u].push_back(z);
		tag[fa[u]].push_back(-z);
		return;
	} 
	int mn=min(dfn[u],dfn[v])+1,mx=max(dfn[u],dfn[v]);
	int lg=__lg(mx-mn+1);
	int lca=_min(st[mn][lg],st[mx-(1<<lg)+1][lg]);
	tag[u].push_back(z),tag[v].push_back(z);
	tag[lca].push_back(-z),tag[fa[lca]].push_back(-z);
}
int ans[N];
void insert(node *u,int x,int val) {
	if(u->l==u->r) {
		u->mx+=val;
		if(u->mx) u->mxid=x;
		return ;
	}
	int mid=u->getmid();
	if(x<=mid) insert(u->ls==nullptr?u->ls=new node (u->l,mid):u->ls,x,val);
	else insert(u->rs==nullptr?u->rs=new node(mid+1,u->r):u->rs,x,val);
	u->pushup();
}
node * merge(node *x,node *y) {
	if(x==nullptr) return y;
	if(y==nullptr) return x;
	if(x->l==x->r) {
		x->mx+=y->mx;
		if(x->mx) x->mxid=x->l;
		return x;
	}
	x->ls=merge(x->ls,y->ls),x->rs=merge(x->rs,y->rs);
	x->pushup();
	return x;
}
node * solve(int u) {
	// pf("solve %d\n",u);
	node *rt=new node(1,n);
	for(int x:tag[u]) {
		// pf("%d ",x);
		if(x>0) insert(rt,x,1);
		else insert(rt,-x,-1);
	}
	// pf("\n");
	for(int i=head[u];i;i=e[i].ne) {
		int v=e[i].to;
		if(v==fa[u]) continue;
		node * rtv=solve(v);
		rt=merge(rt,rtv) ;
	}
	ans[u]=rt->mxid;
	// pf("exit %d\n",u);
	return rt;
}
int main() {
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("my.out","w",stdout);
    #endif
	sf("%d%d",&n,&m);
	rep(i,1,n-1) {
		sf("%d%d",&u,&v);
		addedge(u,v); addedge(v,u);
	}
	dfs(1,0);
	init();
	rep(i,1,m) {
		sf("%d%d%d",&u,&v,&z);
		getlca(u,v,z);
	}
	// pf("???\n");
	solve(1);
	// pf("???\n");
	rep(i,1,n) pf("%d\n",ans[i]);
}
2024/10/9 14:06
加载中...