TLE求助
查看原帖
TLE求助
556740
hzx360楼主2023/6/17 18:46

第一份T了(55pts),第二份是昨晚写的(感觉写得一样啊qaq)。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n,m,X[N],Y[N],Z[N],mx;
int head[N],to[N],ne[N],tot;
void add(int x,int y){
	ne[++tot]=head[x];
	to[tot]=y;
	head[x]=tot;
}
int son[N],top[N],si[N],fa[N],de[N];
void dfs1(int u,int f){
	fa[u]=f,de[u]=de[f]+1,si[u]=1;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==f) continue;
		dfs1(v,u);
		si[u]+=si[v];
		if(si[v]>si[son[u]]) son[u]=v;
	}
}
void dfs2(int u,int topp){
	top[u]=topp;
	if(son[u]) dfs2(son[u],topp);
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==son[u] or v==fa[u]) continue;
		dfs2(v,v);
	}
}
int get_lca(int x,int y){
	while(top[x]!=top[y]){
		if(de[top[x]]<de[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	return de[x]<=de[y]?x:y;
}
struct tree{
	int ls,rs;
	int mx_pos,mx_num;
}t[N];int rt[N],cnt;
#define lson t[i].ls
#define rson t[i].rs
void push_up(int i){
	if(t[lson].mx_num>=t[rson].mx_num) t[i].mx_num=t[lson].mx_num,t[i].mx_pos=t[lson].mx_pos;
	else t[i].mx_num=t[rson].mx_num,t[i].mx_pos=t[rson].mx_pos;
	if(!t[i].mx_num) t[i].mx_pos=0;
}
void change(int &i,int l,int r,int pos,int val){
	if(!i) i=++cnt;
	if(l==r){t[i].mx_num+=val,t[i].mx_pos=pos;return;}
	int mid=(l+r)>>1;
	if(pos<=mid) change(lson,l,mid,pos,val);
	else change(rson,mid+1,r,pos,val);
	push_up(i);
}
int merge(int x,int y,int l,int r){
	if(!x) return y;if(!y) return x;
	if(l==r){t[x].mx_num+=t[y].mx_num,t[x].mx_pos=l;return x;}
	int mid=(l+r)>>1;
	t[x].ls=merge(t[x].ls,t[y].ls,l,mid),t[x].rs=merge(t[x].rs,t[y].rs,mid+1,r);
	push_up(x);
	return x;
}
int ans[N];
void dfs(int u){
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa[u]) continue;
		dfs(v);
		rt[u]=merge(rt[u],rt[v],1,mx);
	}
	ans[u]=t[rt[u]].mx_pos;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int x,y;cin>>x>>y;
		add(x,y),add(y,x);
	}
	dfs1(1,0),dfs2(1,1);
	for(int i=1;i<=m;i++) scanf("%d%d%d",&X[i],&Y[i],&Z[i]),mx=max(mx,Z[i]);
	for(int i=1;i<=m;i++){
		int x=X[i],y=Y[i],z=Z[i];
		int lca=get_lca(x,y);
		change(rt[x],1,mx,z,1),change(rt[y],1,mx,z,1);
		change(rt[lca],1,mx,z,-1);
		if(fa[lca]) change(rt[fa[lca]],1,mx,z,-1);
	} 
	dfs(1);
	for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
}

AC的:

#include<bits/stdc++.h>
using namespace std;
const int N=6000005,M=100005;
int n,m,mxnum[N],rt[M],cnt,mx;
int head[M],to[N],ne[N],tot;
struct tree{int mxpos,ls,rs;}t[N];
void add(int x,int y){
	ne[++tot]=head[x];
	to[tot]=y;
	head[x]=tot;
}
int si[M],son[M],de[M],fa[M],top[M];
void dfs1(int x) {
    si[x]=1;int maxx=-1;
    for(int i=head[x];i;i=ne[i])
    if(!de[to[i]]){
        de[to[i]]=de[x]+1,fa[to[i]]=x;
        dfs1(to[i]);
        si[x]+=si[to[i]];
        if(si[to[i]]>maxx) maxx=si[to[i]],son[x]=to[i];
    }
}
void dfs22(int x,int topf) {
    top[x]=topf;
    if(!son[x]) return;
    dfs22(son[x],topf);
    for(int i=head[x];i;i=ne[i]) if(!top[to[i]]) dfs22(to[i],to[i]);
}
int get_lca(int x,int y) {
    while(top[x]!=top[y]){
        if(de[top[x]]<de[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    if(de[x]<de[y]) return x;
	else return y;
}
void pushup(int i){
	if(mxnum[t[i].ls]>=mxnum[t[i].rs]) mxnum[i]=mxnum[t[i].ls],t[i].mxpos=t[t[i].ls].mxpos;
	else mxnum[i]=mxnum[t[i].rs],t[i].mxpos=t[t[i].rs].mxpos;
	if(!mxnum[i]) t[i].mxpos=0;
}
int change(int i,int l,int r,int pos,int val){
	if(!i) i=++cnt;
	if(l==r){mxnum[i]+=val,t[i].mxpos=pos;return i;}
	int mid=(l+r)>>1;
	if(pos<=mid) t[i].ls=change(t[i].ls,l,mid,pos,val);
	else t[i].rs=change(t[i].rs,mid+1,r,pos,val);
	pushup(i);
	return i;
}
int merge(int x,int y,int l,int r){
	if(!x) return y;
	if(!y) return x;
	if(l==r){mxnum[x]+=mxnum[y],t[x].mxpos=l;return x;}
	int mid=(l+r)>>1;
	t[x].ls=merge(t[x].ls,t[y].ls,l,mid),t[x].rs=merge(t[x].rs,t[y].rs,mid+1,r);
	pushup(x);
	return x;
}
int ans[N];
void dfs2(int u){
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa[u]) continue;
		dfs2(v);
		rt[u]=merge(rt[u],rt[v],1,mx); 
	}
	ans[u]=t[rt[u]].mxpos;
}
int X[N],Y[N],Z[N];
int main(){
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int x,y;scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	de[1]=1,dfs1(1),dfs22(1,1);
	for(int i=1;i<=m;i++) scanf("%d%d%d",&X[i],&Y[i],&Z[i]),mx=max(mx,Z[i]);	
	for(int i=1;i<=m;i++){
		int x=X[i],y=Y[i],z=Z[i];
		int lca=get_lca(x,y);
		rt[x]=change(rt[x],1,mx,z,1),rt[y]=change(rt[y],1,mx,z,1);
		rt[lca]=change(rt[lca],1,mx,z,-1);
		if(fa[lca]) rt[fa[lca]]=change(rt[fa[lca]],1,mx,z,-1);
	}
	dfs2(1);
	for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
}
2023/6/17 18:46
加载中...