萌新线段树合并玄学错误求助
查看原帖
萌新线段树合并玄学错误求助
86579
zmx_wzx_JY楼主2020/8/21 21:55
#include<bits/stdc++.h>
using namespace std;const int N=2e5+5,M=2e7+5;
inline int read(){int res=0,flag=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+c-'0';c=getchar();}return res*flag;}
int f[N][17],dep[N],n,m;vector<int>e[N];int nn=1e5+1;int num;
inline void add(int u,int v){e[u].push_back(v);}
void dfs0(int u,int fa){
	dep[u]=dep[f[u][0]=fa]+1;
	for(int i=1;i<=16;++i)f[u][i]=f[f[u][i-1]][i-1];
	for(int i=e[u].size()-1;i>=0;--i)if(e[u][i]!=fa)dfs0(e[u][i],u);
}inline int LCA(int u,int v){if(dep[u]<dep[v])swap(u,v);
	for(int i=16;i>=0;--i)if(dep[f[u][i]]>=dep[v])u=f[u][i];if(u==v)return u;
	for(int i=16;i>=0;--i)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];return f[u][0];}

struct data{int X,Y;};
inline bool operator>(const data p,const data q){return (p.X!=q.X)?(p.X>q.X):(p.Y<q.Y);}
inline data operator+(const data p,const data q){return (p>q)?p:q;}
namespace SEG{data t[M];int ct,ls[M],rs[M];
	#define mid (l+r>>1)
	void update(int &rt,int l,int r,int pos,int val){if(!rt)rt=++ct;
		if(l==r){t[rt]=(data){t[rt].X+val,l};return ;}
		if(pos<=mid)update(ls[rt],l,mid,pos,val);
		else update(rs[rt],mid+1,r,pos,val);t[rt]=t[ls[rt]]+t[rs[rt]];
	}
	int merge(int rt1,int rt2,int l,int r){
		if(!rt1||!rt2)return rt1|rt2;
		if(l==r){t[rt1].X=t[rt1].X+t[rt2].X;return rt1;}
		ls[rt1]=merge(ls[rt1],ls[rt2],l,mid);rs[rt1]=merge(rs[rt1],rs[rt2],mid+1,r);
		t[rt1]=t[ls[rt1]]+t[rs[rt1]];return rt1;
	}
}

vector<int>col[N],va[N];int ans[N];
void dfs(int u){
	for(int i=e[u].size()-1;i>=0;--i){int v=e[u][i];if(v!=f[u][0])dfs(v),SEG::merge(u,v,1,nn);}
	ans[u]=(SEG::t[u].X==0)?0:SEG::t[u].Y;
}
signed main(){
	//freopen("sb.in","r",stdin);freopen("sb.out","w",stdout);
	SEG::ct=n=read(),m=read();
	for(int i=1;i<n;++i){int u=read(),v=read();add(u,v);add(v,u);}dfs0(1,0);
	for(int i=1;i<=m;++i){int u=read(),v=read(),w=read(),lca=LCA(u,v);
		SEG::update(u,1,nn,w,1);SEG::update(v,1,nn,w,1);
		SEG::update(lca,1,nn,w,-1);SEG::update(f[lca][0],1,nn,w,-1);
    }
	//for(int i=1;i<=SEG::ct;++i)cerr<<i<<" "<<SEG::t[i].X<<" "<<SEG::t[i].Y<<" "<<SEG::ls[i]<<" "<<SEG::rs[i]<<endl;
	dfs(1);for(int i=1;i<=n;++i)printf("%d\n",ans[i]);return 0; 
}

倒数第二个点蜜汁RE(开大空间救不了,我本机上跑进行dfs0时跑到深度为25900的点就会炸,但洛谷评测时如果我在dfs0完之后直接return 0就不会RE)

求大佬指点

2020/8/21 21:55
加载中...