记录编号 306352 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 GravatarMealy 是否通过 通过
代码语言 C++ 运行时间 0.340 s
提交时间 2016-09-11 20:54:07 内存使用 2.16 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#define pb push_back
using namespace std;
const int nmax=20086;
const int vmax=20;
int n,m,q,s=0;
int tmpu,tmpv,tmpdis;
int tmpl,tmpr;
int dtr[nmax];
int list[nmax],deep[nmax];
int pos[nmax];
int smin[nmax][vmax];
bool vis[nmax];
class edge
{
public:
	int u,v;
	int dis;
};
vector<edge> edges;
vector<int > G[nmax];
void PreDo()
{
	scanf("%d%d",&n,&q);
	dtr[n]=0;
	deep[0]=0;
	for(int i=1;i<=n-1;i++)
	{
		dtr[i]=0;
		scanf("%d%d%d",&tmpu,&tmpv,&tmpdis);
		edges.pb((edge){tmpu,tmpv,tmpdis});
		G[tmpu].pb(edges.size()-1);
		edges.pb((edge){tmpv,tmpu,tmpdis});
		G[tmpv].pb(edges.size()-1);
	}
}
void DFS(int x)
{
	s++;
	list[s]=x;
	pos[x]=s;
	vis[x]=1;
	for(int i=0;i<G[x].size();i++)
	{
		if(vis[edges[G[x][i]].v]==0)
		{
			deep[edges[G[x][i]].v]=deep[edges[G[x][i]].u]+1;
			dtr[edges[G[x][i]].v]=edges[G[x][i]].dis+dtr[x];
			DFS(edges[G[x][i]].v);
			s++;
			list[s]=x;
		}
	}
}
int minx(int a,int b)
{
	if(deep[a]>deep[b])
		return b;
	else
		return a;//fanle
}
void exchange(int &tmpl,int &tmpr)
{
	if(pos[tmpl]>pos[tmpr])
	{
		int tmp;
		tmp=tmpl;
		tmpl=tmpr;
		tmpr=tmp;
	}
}
void RMQ()
{
	for(int i=1;i<=s;i++)
		smin[i][0]=list[i];
	for(int j=1;j<vmax;j++)
		for(int i=1;i<=s;i++)
			if(i+(1<<j)-1<=s)
				smin[i][j]=minx(smin[i][j-1],smin[i+(1<<(j-1))][j-1]);

}
int main()
{
	freopen("distance.in","r",stdin);
	freopen("distance.out","w",stdout);
	PreDo();
	DFS(1);
	RMQ();
	//for(int i=1;i<=s;i++)
		//printf("%d ",list[i]);
	//scanf("%d",&q);
	/*for(int j=0;j<1;j++)
	{
		for(int i=1;i<=s;i++)
			printf("%d ",smin[i][j]);
		printf("\n");
	}
	*/
	for(int i=1;i<=q;i++)
	{
		scanf("%d%d",&tmpl,&tmpr);
		exchange(tmpl,tmpr);
		int k=int(floor(log2(pos[tmpr]-pos[tmpl]+1)));//pos[]HIGHLIGHT
		int LCA=minx(smin[pos[tmpl]][k],smin[pos[tmpr]-(1<<k)+1][k]);
		//printf("%d\n",LCA);
		//printf("%d %d\n",k,pos[tmpr]-(1<<k)+1);
		printf("%d\n",dtr[tmpl]+dtr[tmpr]-2*dtr[LCA]);
	}
	/*for(int i=1;i<=n;i++)
		printf("%d ",pos[i]);
	printf("\n");
	for(int i=1;i<=s;i++)
		printf("%d ",list[i]);
	printf("\n");
	for(int i=1;i<=s;i++)
		printf("%d ",deep[list[i]]);
	//for(int i=1;i<=n;i++)
		//printf("%d ",deep[i]);
	*/
	return 0;
}