70分 T了 小清新码风 大佬来卡卡常?
查看原帖
70分 T了 小清新码风 大佬来卡卡常?
225039
Future_Zero楼主2020/7/21 19:16
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=1e5+10;
int n,m,Z,ans[N];
int f[N][20],deep[N];				 //LCA
int nn,first[N],next[N*2],to[N*2];  //手写链接表
int cnt,l[N*80],r[N*80],sum[N*80],T[N];       //数组线段树 
int read()  //读入优化 
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
void add(int x,int y)  //加入邻接表 
{
	next[++nn]=first[x];
	first[x]=nn;
	to[nn]=y;
}
void pre(int x,int fa) //倍增预处理 
{
	deep[x]=deep[fa]+1;
	for(int i=1;i<=18;++i)
		f[x][i]=f[f[x][i-1]][i-1];
	for(int e=first[x];e;e=next[e])
	{
		if(to[e]==fa) continue;
		f[to[e]][0]=x;
		pre(to[e],x);
	}
}
int LCA(int x,int y)  //倍增求LCA 
{
	if(deep[x]<deep[y]) swap(x,y);
	for(int i=18;i>=0;--i)
	{
		if(deep[f[x][i]]>=deep[y]) x=f[x][i];
		if(x==y) return y;
	}
	for(int i=18;i>=0;--i)
	{
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
void pushup(int x)  
{	sum[x]=sum[l[x]]+sum[r[x]]; }
void update(int &x,int L,int R,int k,int val)
{
	if(!x) x=++cnt;
	if(L==R)
	{
		sum[x]+=val;
		return;
	}
	int mid=(L+R)>>1;
	if(k<=mid) update(l[x],L,mid,k,val);
	else update(r[x],mid+1,R,k,val);
	pushup(x);
	return;
}
int merge(int x,int y,int L,int R)  //线段树合并 
{
	if(!x) return y;
	if(!y) return x;
	if(L==R)
	{
		sum[x]+=sum[y];
		return x; 
	}
	int mid=(L+R)>>1;
	l[x]=merge(l[x],l[y],L,mid);
	r[x]=merge(r[x],r[y],mid+1,R);
	pushup(x);
	return x;
}
struct answer  //用来query存临时答案 
{
	int kind,num;
} aa;
void query(int x,int L,int R) //找数量最多的救济粮 
{
	if(!x) return;
	if(L==R)
	{
		if(sum[x]>aa.num) aa={L,sum[x]};
		return;
	}
	int mid=(L+R)>>1;
	query(l[x],L,mid);
	query(r[x],mid+1,R);
	return;
}
void dfs(int x)  //dfs>>从叶节点向根节点合并 并求出答案 
{
	for(int e=first[x];e;e=next[e])
	{
		if(to[e]==f[x][0]) continue;
		dfs(to[e]);
		T[x]=merge(T[x],T[to[e]],1,Z);
	}
	aa={0,0}; 
	query(T[x],1,Z);
	ans[x]=aa.kind;
}
int main()
{
	freopen("P4556_3.in","r",stdin);
	n=read();m=read(); Z=100000;
	for(int i=1;i<=n-1;++i)
	{
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	pre(1,0);
	for(int i=1;i<=m;++i)
	{
		int x=read(),y=read(),z=read();
		int lca=LCA(x,y);
		update(T[x],1,Z,z,1);
		update(T[y],1,Z,z,1);
		update(T[lca],1,Z,z,-1);
		update(T[f[lca][0]],1,Z,z,-1);
	}
	dfs(1);
	for(int i=1;i<=n;++i)
		printf("%d\n",ans[i]);
	return 0;
}

实在不知道为什么T啊这常数到1e3了???

2020/7/21 19:16
加载中...