一个非常奇怪的UB
查看原帖
一个非常奇怪的UB
306734
phil071128楼主2023/8/16 08:12

本机+不开 O2O2 IDE 测试点1(样例)都能过,但是评测记录一半T一半RE。目前已探查的情况是 dfs3() 前应该都对,dfs3()中无法遍历vector导致超时。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int dep[N],fa[N],siz[N],son[N],id[N],top[N];
vector<int>s[N];
void dfs1(int x,int f){
	dep[x]=dep[f]+1;
	fa[x]=f;
	siz[x]=1;
	int maxson=-1;
	for(int i=0;i<s[x].size();i++){
		int y=s[x][i];
		if(y==f) continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[y]>=maxson) {
			maxson=siz[y];
			son[x]=y;
		}
	}
}
int ct;
void dfs2(int x,int topf){
	top[x]=topf;
	id[x]=++ct;
	if(son[x]) dfs2(son[x],topf);
	for(int i=0;i<s[x].size();i++){
		int y=s[x][i];
		if(y==fa[x]||y==son[x]) continue;
		dfs2(y,y);
	}
}
int tree[N*4],tid[N*4],cnt;
int ls[N],rs[N];
void push_up(int p){
	tree[p]=max(tree[ls[p]],tree[rs[p]]);
	tid[p]=9999999;
	if(tree[ls[p]]==tree[p]) tid[p]=min(tid[p],tid[ls[p]]);
	if(tree[rs[p]]==tree[p]) tid[p]=min(tid[p],tid[rs[p]]);
	return ;
}
int k,n,m;
#define MID int mid=l+r>>1;
int update(int p,int l,int r,int x,int k){
	if(!p) p=++cnt;
	if(l==r) {
		tree[p]+=k;
		tid[p]=x;//
		return p;
	} 
	MID;
	if(x<=mid) ls[p]=update(ls[p],l,mid,x,k);
	else rs[p]=update(rs[p],mid+1,r,x,k);
	push_up(p);
	return p;
}
int LCA(int x,int y){
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return x;
}
int merge(int p,int q,int l,int r){
	//q=p+q
	if(!p||!q) return p+q;
	if(l==r){
		tree[q]=tree[p]+tree[q];
		tid[q]=l;
		return q;
	}
	MID;
	ls[q]=merge(ls[p],ls[q],l,mid);
	rs[q]=merge(rs[p],rs[q],mid+1,r);
	push_up(q);
	return q;
}
int rt[N],ans[N];
int dfs3(int x){
	for(int i=0;i<s[x].size();i++){
		int y=s[x][i];
		if(y==fa[x]) continue;
		dfs3(y);
		rt[x]=merge(rt[y],rt[x],1,k);
	}
	ans[x]=tid[rt[x]];
}
int read(){
	int h=0;char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) h=(h<<1)+(h<<3)+c-'0',c=getchar();
	return h;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<n;i++) {
		int u=read(),v=read();
		s[u].push_back(v);
		s[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	k=int(1e5);
	for(int i=1;i<=m;i++) {
		int x=read(),y=read(),z=read(),lca=LCA(x,y);
		rt[x]=update(rt[x],1,k,z,1);
		rt[y]=update(rt[y],1,k,z,1);
		rt[lca]=update(rt[lca],1,k,z,-1);
//		cout<<lca<<endl;
		if(fa[lca]) rt[fa[lca]]=update(rt[fa[lca]],1,k,z,-1);
	}
	dfs3(1);
	for(int i=1;i<=n;i++) cout<<ans[i]<<"\n";	
	return 0;
}
cpp```
2023/8/16 08:12
加载中...