记录编号 303377 评测结果 AAAAAAAAAA
题目名称 [ZLXOI 2015][异次元圣战III]ZLX的陨落 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.177 s
提交时间 2016-09-05 10:56:10 内存使用 5.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
namespace mine{
	inline int getint(){
		static int __c,__x;
		static bool __neg;
		__x=0;
		__neg=false;
		do __c=getchar();while(__c==' '||__c=='\n'||__c=='\r'||__c=='\t');
		if(__c=='-'){
			__neg=true;
			__c=getchar();
		}
		for(;__c>='0'&&__c<='9';__c=getchar())__x=__x*10+(__c^48);
		if(__neg)return -__x;
		return __x;
	}
	inline void putint(int __x){
		static int __a[40],__i,__j;
		static bool __neg;
		__neg=__x<0;
		if(__neg)__x=-__x;
		__i=0;
		do{
			__a[__i++]=__x%10+48;
			__x/=10;
		}while(__x);
		if(__neg)putchar('-');
		for(__j=__i-1;__j^-1;__j--)putchar(__a[__j]);
	}
}
using namespace mine;
const int maxn=100010;
struct edge{
	int to,prev,dis;
}e[maxn<<1];
struct Q{
	int y,id,prev;
}q[maxn<<2];
struct A{
	int x,i;
}a[maxn];
void inserte(int,int,int);
void insertq(int,int,int);
void dfs(int);
int findroot(int);
int laste[maxn]={0},lastq[maxn]={0},dis[maxn],prt[maxn],anc[maxn],ans[maxn<<1];
bool vis[maxn]={false};
int n,m,x,y,z,lene=0,lenq=0,top=0;
inline int MAIN(){
#define MINE
#ifdef MINE
	freopen("ThefallingofZLX.in","r",stdin);
	freopen("ThefallingofZLX.out","w",stdout);
#endif
	n=getint();
	getint();
	for(int i=1;i<n;i++){
		x=getint();
		y=getint();
		z=getint();
		inserte(x,y,z);
		inserte(y,x,z);
	}
	m=getint();
	for(int i=1;i<=m;i++){
		x=getint();
		y=getint();
		insertq(x,y,i);
		insertq(y,x,i);
	}
	dis[1]=prt[1]=0;
	dfs(1);
	for(int i=1;i<=m;i++){
		putint(ans[i]);
		putchar('\n');
	}
#ifndef MINE
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}
inline void inserte(int x,int y,int z){
	e[++lene].to=y;
	e[lene].prev=laste[x];
	e[lene].dis=z;
	laste[x]=lene;
}
inline void insertq(int x,int y,int i){
	q[++lenq].y=y;
	q[lenq].id=i;
	q[lenq].prev=lastq[x];
	lastq[x]=lenq;
}
inline void dfs(int x){
	int y,i;
	a[++top].x=x;
	a[top].i=laste[x];
	while(top){
		x=a[top].x;
		i=a[top].i;
		if(e[i].to==prt[x])i=e[i].prev;
		if(i){
			a[top].i=e[i].prev;
			y=e[i].to;
			prt[y]=x;
			dis[y]=dis[x]+e[i].dis;
			a[++top].x=y;
			a[top].i=laste[y];
			anc[y]=y;
		}
		else{
			vis[x]=true;
			for(i=lastq[x];i;i=q[i].prev){
				y=q[i].y;
				if(vis[y])ans[q[i].id]=dis[x]+dis[y]-(dis[findroot(y)]<<1);
			}
			anc[x]=prt[x];
			top--;
		}
	}
}
inline int findroot(int x){
	static int rt,y;
	rt=anc[x];
	while(anc[rt]!=rt)rt=anc[rt];
	while(anc[x]!=x){
		y=anc[x];
		anc[x]=rt;
		x=y;
	}
	return rt;
}
int hzoier=MAIN();
int main(){;}