萌新袜子求助
查看原帖
萌新袜子求助
101975
OranJun楼主2020/8/1 20:28

35pts WA

/*Code by Codercjh*/
#include<bits/stdc++.h>
#define fr(i,a,b) for(int i=(a);i<=(b);++i)
#define rf(i,a,b) for(int i=(a);i>=(b);--i)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T &x){
	char c=getchar();T fh=0;bool f=false;
	while(!isdigit(c))f|=(c=='-'),c=getchar();
	while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar();
	x=f?-fh:fh;
	return;
}
const int N=1e5+5;
int head[N],tot;
struct node{int to,nxt;}e[2*N];
inline void add(int x,int y){e[++tot]=(node){y,head[x]};head[x]=tot;}
struct Seg_tree{int lc,rc,dat,ans;}tr[60*N];
int n,m;
int f[N][18],dep[N],rt[N];
void dfs(int x,int fa){
	f[x][0]=fa;
	dep[x]=dep[fa]+1;
	fr(i,1,17)f[x][i]=f[f[x][i-1]][i-1];
	for(int i=head[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(y==fa)continue;
		dfs(y,x);
	}
}
int lca(int x,int y){//LCA
	if(dep[x]<dep[y])swap(x,y);
	rf(i,17,0)if(dep[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	rf(i,17,0)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
int t;
int add(int p,int l,int r,int x,int v){
	if(!p)p=++t;
	if(l==r){
		tr[p].dat+=v;
		tr[p].ans=l;
		return p;
	}
	int mid=(l+r)>>1;
	if(x<=mid)tr[p].lc=add(tr[p].lc,l,mid,x,v);
	else tr[p].rc=add(tr[p].rc,mid+1,r,x,v);
	if(tr[tr[p].lc].dat>=tr[tr[p].rc].dat)tr[p].dat=tr[tr[p].lc].dat,tr[p].ans=tr[tr[p].lc].ans;
	else tr[p].dat=tr[tr[p].rc].dat,tr[p].ans=tr[tr[p].rc].ans;
	return p;
}
int merge(int p,int q,int l,int r){
	if(!p)return q;
	if(!q)return p;
	if(l==r){
		tr[p].dat+=tr[q].dat;
		tr[p].ans=l; 
		return p;
	} 
	int mid=(l+r)>>1;
	tr[p].lc=merge(tr[p].lc,tr[q].lc,l,mid);
	tr[p].rc=merge(tr[p].rc,tr[q].rc,mid+1,r);
	if(tr[tr[p].lc].dat>=tr[tr[p].rc].dat)tr[p].dat=tr[tr[p].lc].dat,tr[p].ans=tr[tr[p].lc].ans;
	else tr[p].dat=tr[tr[p].rc].dat,tr[p].ans=tr[tr[p].rc].ans;
    return p;
}
int mx;
void dfs1(int x,int fa){
	for(int i=head[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(y==fa)continue;
		dfs1(y,x);
		rt[x]=merge(rt[x],rt[y],1,mx);
	}
}
int ask(int p,int l,int r,int x){
	if(l==r)return tr[p].dat;
	int mid=(l+r)>>1;
	if(x<=mid)return ask(tr[p].lc,l,mid,x);
	return ask(tr[p].rc,mid+1,r,x);
}
int qx[N],qy[N],qz[N],xx[N],to;
int main(){
    read(n),read(m);
    int a,b;
	fr(i,1,n-1)read(a),read(b),add(a,b),add(b,a);
	dfs(1,0);
	fr(i,1,m)read(qx[i]),read(qy[i]),read(qz[i]),xx[++to]=qz[i];
	sort(xx+1,xx+to+1);
	int sz=unique(xx+1,xx+to+1)-xx-1;
	mx=sz;
	fr(i,1,m){
		int zx=lca(qx[i],qy[i]);
		qz[i]=lower_bound(xx+1,xx+sz+1,qz[i])-xx;
		rt[qx[i]]=add(rt[qx[i]],1,mx,qz[i],1);
		rt[qy[i]]=add(rt[qy[i]],1,mx,qz[i],1);
		rt[zx]=add(rt[zx],1,mx,qz[i],-1);
		if(f[zx][0])rt[f[zx][0]]=add(rt[f[zx][0]],1,mx,qz[i],-1);
	}
	dfs1(1,0);
	fr(i,1,n)printf("%d\n",tr[rt[i]].dat?xx[tr[rt[i]].ans]:0);
	return 0;
}

2020/8/1 20:28
加载中...