下载了点1能过交上去全WALOJ甚至CE求助
查看原帖
下载了点1能过交上去全WALOJ甚至CE求助
804759
oiler153楼主2024/7/30 18:42

RT

#include<iostream>
#include<vector>
#include<map>
using namespace std;
#define int unsigned int
int xu[41000],cnt1,lca,n1,x,y,z,q,n,m,vv[41000],e1[41000],idx1=2,ne1[41000],h1[41000],
he[41451],inzhan[41451],zhan[44514],cnt,ju[44514],duiying[41000],fan[41000];
void add1(int u,int v1,int v2){
	e1[idx1]=v1,ne1[idx1]=h1[u],vv[idx1]=v2,h1[u]=idx1++;
}
map<pair<int,int>,int>dis;
vector<int>dian[20010],huan[20010];//点属于那些环,一个环中有那些点 
void dfs1(int jie,int fa){
	xu[jie]=1;
	zhan[++cnt]=jie;
	inzhan[jie]=1;
	for(int i=h1[jie];i;i=ne1[i]){
		if(e1[i]==fa||(xu[e1[i]]&&(inzhan[e1[i]]==0)))
			continue;
		if(inzhan[e1[i]]){
			he[++cnt1]=vv[i]-ju[e1[i]]+ju[jie];
			fan[cnt1]=++n;
			duiying[n]=cnt1;
			while((zhan[cnt]!=e1[i])&&cnt){
				inzhan[zhan[cnt]]=0;
				huan[cnt1].push_back(zhan[cnt]);
				dian[zhan[cnt]].push_back(cnt1);
				dis[{zhan[cnt],cnt1}]=ju[zhan[cnt--]]-ju[e1[i]];
				//dis[zhan[cnt]]=
			}
			if(cnt||(zhan[1]==e1[i])){
				huan[cnt1].push_back(e1[i]);
				dian[e1[i]].push_back(cnt1);
				dis[{zhan[cnt],cnt1}]=ju[zhan[cnt]]-ju[e1[i]];
				while(zhan[++cnt]);
				cnt--;
			}else{
				while(zhan[cnt]){
					huan[cnt1].pop_back();
					dian[zhan[cnt++]].pop_back();
				}
				cnt1--;
			}
			continue;
		}
		ju[e1[i]]=ju[jie]+vv[i];
		//zhan2[cnt]=i;
		dfs1(e1[i],jie);
	}
	
	zhan[cnt--]=inzhan[jie]=0;
}
#define jl(x,y,z) min((max(dis[{x,z}],dis[{y,z}])-min(dis[{x,z}],dis[{y,z}])),he[z]-max(dis[{x,z}],dis[{y,z}])+min(dis[{x,z}],dis[{y,z}]))
int e[41000],idx=2,ne[41000],h[41000],v[41000];
bool fang[41000];
void add(int u,int v1,int v2){
	e[idx]=v1,ne[idx]=h[u],v[idx]=v2,h[u]=idx++;
}
void dfs2(int jie){
	inzhan[jie]=zhan[jie]=1;
	for(int i=0;i<dian[jie].size();i++){
		if(fang[dian[jie][i]])
			continue;
		fang[dian[jie][i]]=1;
		add(jie,fan[dian[jie][i]],0);
//		duiying[n]=dian[jie][i];
		for(int j=0;j<huan[dian[jie][i]].size();j++){
			if(huan[dian[jie][i]][j]==jie)
				continue;
			add(fan[dian[jie][i]],huan[dian[jie][i]][j],jl(jie,huan[dian[jie][i]][j],dian[jie][i]));
			inzhan[huan[dian[jie][i]][j]]=1;
		}
		for(int j=0;j<huan[dian[jie][i]].size();j++){
			if(zhan[huan[dian[jie][i]][j]])continue;
			dfs2(huan[dian[jie][i]][j]);
		}
	}
	for(int i=h1[jie];i;i=ne1[i]){
		if(inzhan[e1[i]])
			continue;
		add(jie,e1[i],vv[i]);
		dfs2(e1[i]);
	}
}
int read() {
  int x = 0;
  char ch = 0;
  while (ch < '0' || ch > '9') {  
    ch = getchar();       
  }
  while (ch >= '0' && ch <= '9') {  
    x = x * 10 + (ch - '0');  
    ch = getchar();
  }
  return x;
}
int son[41000],fa1[41000],fa[41000],s[41000],size[41000],dep[41000],jf[41000];
void dfs3(int jie,int fa){
	fa1[jie]=fa;dep[jie]=dep[fa]+1;
	int maxx=0;
	size[jie]=1;
	for(int i=h[jie];i;i=ne[i]){
		if(e[i]==fa)
			continue;
		dfs3(e[i],jie);
		size[jie]+=size[e[i]];
		if(maxx<size[e[i]])
			son[jie]=e[i],maxx=size[e[i]];
	}
}
void dfs4(int jie,int fa1){	
	fa[jie]=fa1;
	for(int i=h[jie];i;i=ne[i]){
		if(son[jie]==e[i]){
			xu[son[jie]]=++cnt;
			jf[son[jie]]=s[cnt]=v[i];
			dfs4(son[jie],fa1);
		}
	}
	for(int i=h[jie];i;i=ne[i]){
		if(e[i]==son[jie])
			continue;
		xu[e[i]]=++cnt;
		jf[e[i]]=s[cnt]=v[i];
		dfs4(e[i],e[i]);
	}
}
int lca1(int x,int y){
	while(1){
		if(fa[x]==fa[y]){
			if(dep[x]>dep[y])
				return y;
			return x;
		}
		if(dep[fa[x]]>dep[fa[y]]){
			x=fa1[fa[x]];
		}else{
			y=fa1[fa[y]];
		}
	}
}
void write(int x) {
  static int sta[35];
  int top = 0;
  do {
    sta[top++] = x % 10, x /= 10;
  } while (x);
  while (top) putchar(sta[--top] + 48);
  putchar('\n');
}
int qurry(int x,int y){
	int ret=0;
	/*while(x^y){
		if(dep[x]<dep[y]){
			ret+=jf[y],y=fa1[y];
		}else{
			ret+=jf[x],x=fa1[x];
		}
	}return ret;*/
	while(1){
		if(fa[x]==fa[y]){
			if(dep[x]>dep[y])
				return ret+s[xu[x]]-s[xu[y]];
			return ret+s[xu[y]]-s[xu[x]];
		}
		if(dep[fa[x]]>dep[fa[y]]){
			ret+=s[xu[x]]-s[xu[fa[x]]]+jf[fa[x]];
			x=fa1[fa[x]];
		}else{
			ret+=s[xu[y]]-s[xu[fa[y]]]+jf[fa[y]];
			y=fa1[fa[y]];
		}
	}
}
int lxia(int x){

	while(fa[x]!=fa[lca]){
		x=fa[x];
		if(fa1[x]!=lca)
			x=fa1[x];
		else
			return x;
	}return son[lca];
}

signed main(){
//	freopen("P5236_1.in","r",stdin);
//	freopen("P5236.txt","w",stdout);
//	system("fc P5236.txt P5236_1.out");
	n1=n=read(),m=read(),q=read();
	for(int i=1;i<=m;i++){
		x=read(),y=read(),z=read();
		add1(x,y,z),add1(y,x,z);
	}
	dfs1(1,0);cnt=0;

	for(int i=1;i<=n;i++)zhan[i]=inzhan[i]=0;
	dfs2(1);xu[1]=cnt=1;
	dfs3(1,0);
	dfs4(1,1);
	for(int i=2;i<=n;i++)
		s[i]=s[i-1]+s[i];
	while(q--){
		x=read(),y=read();
		
		lca=lca1(x,y);
		if(lca<=n1){
			write(qurry(x,y));
			continue;
		}
		m=lxia(x),z=lxia(y);
		write(qurry(x,m)+qurry(y,z)+jl(m,z,duiying[lca]));
	}
	return 0;
}
/*
10 11 1
1 2 1
1 5 2
1 6 2
1 10 2
2 3 1
3 4 1
4 5 1
6 7 1
7 8 3
8 9 1
9 10 1
5 6


10 12 1
1 2 1
2 4 1
4 5 1
5 3 1
3 1 1
5 6 1
6 7 1
7 8 1 
8 5 1
5 9 1
9 10 1
5 10 1
9 7
*/
2024/7/30 18:42
加载中...