关于第一个测试数据是样例,然后我在成功过掉样例后第一个点TLE
查看原帖
关于第一个测试数据是样例,然后我在成功过掉样例后第一个点TLE
497498
weizichang楼主2023/7/11 16:26

这辈子没有遇见过这么离谱的事情

#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<cmath>
#include<ctime>
#include<bitset>
#include<deque>
#include<queue>
#include<functional>
#include<limits>
#include<sstream>
#include<string>
#include<cstring>
#include<utility>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>//用tree
#include<ext/pb_ds/hash_policy.hpp>//用hash
#include<ext/pb_ds/trie_policy.hpp>//用trie
#include<ext/pb_ds/priority_queue.hpp>//用priority_queue
#define LL long long
#define db double
using namespace std;
//using namespace __gnu_pbds;
template<typename T>
T &read(T &r){
   r=0;bool w=0;char ch=getchar();
   while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
   while(ch>='0'&&ch<='9') r=r*10+(ch^48),ch=getchar();
   return r=w?-r:r;
}
const int N=1e5+10,t=25;
vector<int> g[N];
int n,m,fa[N][27],dep[N];
//LCA
void dfs1(int u,int fath){
	fa[u][0]=fath;
	dep[u]=dep[fath]+1;
	for(int i=1;i<=t;i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(auto v:g[u]){
		if(v!=fath) dfs1(v,u);
	}
}
int LCA(int x,int y){
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=t;i>=0;i--){
		if(dep[fa[y][i]]>=dep[x]) y=fa[y][i];
	}
	if(x==y) return x;
	for(int i=t;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i],y=fa[y][i];
		}
	}
	return fa[x][0];
}
//SGT merge
int R[N],val[N<<6],mx[N<<6],ls[N<<6],rs[N<<6],node,ans[N];
void pushup(int x){
	val[x]=max(val[ls[x]],val[rs[x]]);
	mx[x]=val[x]==val[ls[x]]?mx[ls[x]]:mx[rs[x]];
	return ;
}
void update(int l,int r,int &x,int p,int v){
	if(!x) x=++node;
	if(l==r){
		val[x]+=v;
		mx[x]=/*l*/p;
		return ;
	}
	int mid=l+r>>1;
	if(p<=mid) update(l,mid,ls[x],p,v);
	else update(mid+1,r,rs[x],p,v);
	pushup(x);
	return ;
}
int merge(int x,int y,int l,int r){
	if(!x||!y) return x|y;
	if(l==r){
		val[x]+=val[y];
		mx[x]=l;
		return x;	
	}
	int mid=l+r>>1;
	ls[x]=merge(ls[x],ls[y],l,mid),rs[x]=merge(rs[x],rs[y],mid+1,r);
	pushup(x);
	return x;
}
int dfs2(int u,int fath){
	for(auto v:g[u]){
		if(v==fath) continue;
		dfs2(v,u);
		R[u]=merge(R[u],R[v],1,n);
	}
	ans[u]=val[R[u]]?mx[R[u]]:0;
}
signed main(){
	read(n),read(m);
	for(int i=1;i<=n-1;i++){
		int a,b;
		read(a),read(b);
		g[a].push_back(b),g[b].push_back(a);
	}
	dfs1(1,0);
	/*while(true){
		int x,y;
		read(x),read(y);
		printf("%d %d:%d\n",x,y,LCA(x,y));
	}*/
	for(int i=1;i<=m;i++){
		int x,y,z;
		read(x),read(y),read(z);
		int lca=LCA(x,y);
//		printf("%d and %d's lca is:%d\n",x,y,lca);
		update(1,n,R[x],z,1);
		update(1,n,R[y],z,1);
		update(1,n,R[lca],z,-1);
		if(fa[lca][0]) update(1,n,R[fa[lca][0]],z,-1);
	}
	dfs2(1,0);
	for(int i=1;i<=n;i++){
		printf("%d\n",ans[i]);
	}
    return 0;
}
2023/7/11 16:26
加载中...