CSP 2022 压行的艺术

可能更好的阅读体验

众所周知,我校流传着压行文化,同学都很会压行。

这里展示几个我校压行人,给大家欣赏一下压行的艺术。

No.1

holiday.cpp

//从每个点出发 BFS,可以预处理出每对个点之间能否 $k$ 次通达
//枚举 $4$ 个不同景点中间的两个景点,剩余两个景点都只需满足与中间某一个景点以及 $1$ 号景点可 $k$ 次通达
//所以对每个点预处理出满足与它之间 $1$ 号景点可 $k$ 次通达的权值前 $3$ 大的景点,每次暴力枚举即可

//感觉没啥问题,$(3*2500)^2$ 看上去也很合理

#include<bits/stdc++.h>
#define Cn const
#define CI Cn int&
#define N 2500
#define M 10000
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
using namespace std;
int n,m,k,ee,lnk[N+5];long long a[N+5];struct edge {int to,nxt;}e[2*M+5];
int d[N+5],q[N+5];bool w[N+5][N+5];void BFS(int s)
{
	int i,x,H,T;for(i=1;i<=n;++i) d[i]=-1;d[q[H=T=1]=s]=0;
	while(H<=T&&d[q[H]]<=k) for(i=lnk[x=q[H++]];i;i=e[i].nxt) !~d[e[i].to]&&(d[q[++T]=e[i].to]=d[x]+1);
	for(i=1;i<=n;++i) ~d[i]&&(w[s][i]=1);
}
int p[N+5][3];void Init(int x)
{
	int c=0;for(int i=2;i<=n;++i) if(i^x&&w[x][i]&&w[i][1])
	if(a[p[x][0]]<a[i]) p[x][2]=p[x][1],p[x][1]=p[x][0],p[x][0]=i;
	else if(a[p[x][1]]<a[i]) p[x][2]=p[x][1],p[x][1]=i;else if(a[p[x][2]]<a[i]) p[x][2]=i;
}
int main()
{
	freopen("holiday.in","r",stdin),freopen("holiday.out","w",stdout);
	int i,j,x,y;for(scanf("%d%d%d",&n,&m,&k),i=2;i<=n;++i) scanf("%lld",a+i);
	for(i=1;i<=m;++i) scanf("%d%d",&x,&y),add(x,y),add(y,x);for(i=1;i<=n;++i) BFS(i);for(i=2;i<=n;++i) Init(i);
	long long ans=0;for(i=2;i<=n;++i) for(j=i+1;j<=n;++j) if(w[i][j]) for(x=0;x<=2&&p[i][x];++x) for(y=0;y<=2&&p[j][y];++y)
	if(p[i][x]^j&&p[j][y]^i&&p[i][x]^p[j][y]) {ans=max(ans,a[i]+a[j]+a[p[i][x]]+a[p[j][y]]);break;}
	return printf("%lld\n",ans),0;
}

game.cpp

//显然小 Q 会根据小 L 的选择选出一个数让乘积最小,小 L 要从所有的结果选择中选出乘积最大的
//根据 $x<y$ 两边同时乘上一个数 $p$ 后当且仅当 $p$ 为负数时不等号取反,容易发现策略只与正负性有关
//所以分别讨论小 L 选正数、负数的情况,然后根据每种情况中小 Q 选出的数的正负性,确定小 L 的选择即可
//特殊地,$0$ 应该可以归入任一情况 

//毕竟是考场上,直接无脑写了三棵线段树,而没有追求最短的写法 

#include<bits/stdc++.h>
#define Cn const
#define CI Cn int&
#define N 100000
#define INF (int)2e9
#define LL long long
using namespace std;
namespace FastIO
{
	#define FS 100000
	#define Tp template<typename Ty>
	#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
	#define pc(c) (FC==FE&&(clear(),0),*FC++=c)
	#define clear() (fwrite(FO,1,FC-FO,stdout),FC=FO)
	#define D isdigit(oc=tc())
	int ff,OT;char oc,FI[FS],FO[FS],OS[30],*FA=FI,*FB=FI,*FC=FO,*FE=FO+FS;
	Tp void read(Ty& x) {x=0,ff=1;while(!D) ff=oc^'-'?1:-1;while(x=(x<<3)+(x<<1)+(oc&15),D);x*=ff;}
	Tp void writeln(Ty x) {x<0&&(pc('-'),x=-x);while(OS[++OT]=x%10+48,x/=10);while(OT) pc(OS[OT--]);pc('\n');}
}using namespace FastIO;
int n,m,a[N+5],b[N+5];
class SegmentTree1
{
	private:
		#define PT int l=1,int r=n,int o=1
		#define LT l,u,o<<1
		#define RT u+1,r,o<<1|1
		int Mn[N<<2],Mx[N<<2];
	public:
		void Bd(PT)
		{
			if(l==r) return (void)(a[l]>=0?Mn[o]=Mx[o]=a[l]:(Mn[o]=INF,Mx[o]=-INF));
			int u=l+r>>1;Bd(LT),Bd(RT),Mn[o]=min(Mn[o<<1],Mn[o<<1|1]),Mx[o]=max(Mx[o<<1],Mx[o<<1|1]);
		}
		int QMn(int L,int R,PT)
		{
			if(L==l&&r==R) return Mn[o];int u=l+r>>1;return R<=u?QMn(L,R,LT):(L>u?QMn(L,R,RT):min(QMn(L,u,LT),QMn(u+1,R,RT)));
		}
		int QMx(int L,int R,PT)
		{
			if(L==l&&r==R) return Mx[o];int u=l+r>>1;return R<=u?QMx(L,R,LT):(L>u?QMx(L,R,RT):max(QMx(L,u,LT),QMx(u+1,R,RT)));
		}
}A1;
class SegmentTree2
{
	private:
		#define PT int l=1,int r=n,int o=1
		#define LT l,u,o<<1
		#define RT u+1,r,o<<1|1
		int Mn[N<<2],Mx[N<<2];
	public:
		void Bd(PT)
		{
			if(l==r) return (void)(a[l]<=0?Mn[o]=Mx[o]=a[l]:(Mn[o]=INF,Mx[o]=-INF));
			int u=l+r>>1;Bd(LT),Bd(RT),Mn[o]=min(Mn[o<<1],Mn[o<<1|1]),Mx[o]=max(Mx[o<<1],Mx[o<<1|1]);
		}
		int QMn(int L,int R,PT)
		{
			if(L==l&&r==R) return Mn[o];int u=l+r>>1;return R<=u?QMn(L,R,LT):(L>u?QMn(L,R,RT):min(QMn(L,u,LT),QMn(u+1,R,RT)));
		}
		int QMx(int L,int R,PT)
		{
			if(L==l&&r==R) return Mx[o];int u=l+r>>1;return R<=u?QMx(L,R,LT):(L>u?QMx(L,R,RT):max(QMx(L,u,LT),QMx(u+1,R,RT)));
		}
}A2;
class SegmentTree3
{
	private:
		#define PT int l=1,int r=m,int o=1
		#define LT l,u,o<<1
		#define RT u+1,r,o<<1|1
		int Mn[N<<2],Mx[N<<2];
	public:
		void Bd(PT)
		{
			if(l==r) return (void)(Mn[o]=Mx[o]=b[l]);
			int u=l+r>>1;Bd(LT),Bd(RT),Mn[o]=min(Mn[o<<1],Mn[o<<1|1]),Mx[o]=max(Mx[o<<1],Mx[o<<1|1]);
		}
		int QMn(int L,int R,PT)
		{
			if(L==l&&r==R) return Mn[o];int u=l+r>>1;return R<=u?QMn(L,R,LT):(L>u?QMn(L,R,RT):min(QMn(L,u,LT),QMn(u+1,R,RT)));
		}
		int QMx(int L,int R,PT)
		{
			if(L==l&&r==R) return Mx[o];int u=l+r>>1;return R<=u?QMx(L,R,LT):(L>u?QMx(L,R,RT):max(QMx(L,u,LT),QMx(u+1,R,RT)));
		}
}B;
int main()
{
	freopen("game.in","r",stdin),freopen("game.out","w",stdout);
	int Qt,i;for(read(n),read(m),read(Qt),i=1;i<=n;++i) read(a[i]);for(i=1;i<=m;++i) read(b[i]);A1.Bd(),A2.Bd(),B.Bd();
	int l1,r1,l2,r2,p1,q1,p2,q2;LL S1,S2;while(Qt--)
	{
		read(l1),read(r1),read(l2),read(r2);
		p1=(q1=B.QMn(l2,r2))>=0?A1.QMx(l1,r1):A1.QMn(l1,r1),S1=abs(p1)==INF?(LL)-1e18:1LL*p1*q1;
		p2=(q2=B.QMx(l2,r2))>=0?A2.QMx(l1,r1):A2.QMn(l1,r1),S2=abs(p2)==INF?(LL)-1e18:1LL*p2*q2;
		writeln(max(S1,S2));
	}return clear(),0;
}

galaxy.cpp

//如果我没理解错的话,题目意思应该就是要求判断是否每个点恰好有一条出边?
//然后这玩意儿似乎是一种非常经典的难以直接维护的信息,数据范围又表明了不可能是根号算法
//于是考虑给每个点随机一个权值乱搞,感觉挺对
//而且也比较贴合题目中直接给端点而不是给边的编号这种输入方式 
//第一次考场上写卡时,希望别挂

//不多管	无脑贪心把分骗
//好运来	随机乱搞出正解 

#include<bits/stdc++.h>
#define Cn const
#define CI Cn int&
#define N 500000
#define ull unsigned long long
using namespace std;
namespace FastIO
{
	#define FS 100000
	#define Tp template<typename Ty>
	#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
	char oc,FI[FS],*FA=FI,*FB=FI;
	Tp void read(Ty& x) {x=0;while(!isdigit(oc=tc()));while(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));}
}using namespace FastIO;
int n,m,Qt,d[N+5],d0[N+5],ans[N+5];struct edge {int x,y;}s[N+5];struct OP {int op,x,y;}q[N+5];
ull v[N+5],h[N+5],h0[N+5];void Solve()
{
	int i;ull V=0;for(i=1;i<=n;++i) v[i]=1ull*rand()*rand(),V^=v[i],h0[i]=0;
	ull H=V;for(i=1;i<=m;++i) h0[s[i].y]^=v[s[i].x],H^=v[s[i].x];for(i=1;i<=n;++i) h[i]=h0[i];
	for(i=1;i<=Qt;H&&(ans[i]=0),++i) switch(q[i].op)
	{
		case 1:H^=v[q[i].x],h[q[i].y]^=v[q[i].x];break;case 2:H^=h[q[i].x],h[q[i].x]=0;break;
		case 3:H^=v[q[i].x],h[q[i].y]^=v[q[i].x];break;case 4:H^=h[q[i].x]^h0[q[i].x],h[q[i].x]=h0[q[i].x];break;
	}
}
int main()
{
	freopen("galaxy.in","r",stdin),freopen("galaxy.out","w",stdout);
	int i;for(read(n),read(m),i=1;i<=m;++i) read(s[i].x),read(s[i].y),++d0[s[i].y];for(i=1;i<=n;++i) d[i]=d0[i];
	int D=m;for(read(Qt),i=1;i<=Qt;ans[i++]=D==n) switch(read(q[i].op),read(q[i].x),q[i].op)
	{
		case 1:read(q[i].y),--D,--d[q[i].y];break;case 2:D-=d[q[i].x],d[q[i].x]=0;break;
		case 3:read(q[i].y),++D,++d[q[i].y];break;case 4:D+=d0[q[i].x]-d[q[i].x],d[q[i].x]=d0[q[i].x];break;
	}
	srand(20220722);while(1.0*clock()/CLOCKS_PER_SEC<1.5) Solve();
	for(i=1;i<=Qt;++i) puts(ans[i]?"YES":"NO");return 0;
}

transmit.cpp

//没想错的话似乎是倍增+矩乘裸题?
//$k=3$ 的时候需要考虑一下跳出路径的情况

//T4 应该不会这么简单啊,但暂时没想到 Hack,选择摆烂 

#include<bits/stdc++.h>
#define Cn const
#define CI Cn int&
#define N 200000
#define K 3
#define LN 17
#define LL long long
#define INF (LL)1e18
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
using namespace std;
namespace FastIO
{
	#define FS 100000
	#define Tp template<typename Ty>
	#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
	#define pc(c) (FC==FE&&(clear(),0),*FC++=c)
	#define clear() (fwrite(FO,1,FC-FO,stdout),FC=FO)
	int OT;char oc,FI[FS],FO[FS],OS[30],*FA=FI,*FB=FI,*FC=FO,*FE=FO+FS;
	Tp void read(Ty& x) {x=0;while(!isdigit(oc=tc()));while(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));}
	Tp void writeln(Ty x) {while(OS[++OT]=x%10+48,x/=10);while(OT) pc(OS[OT--]);pc('\n');}
}using namespace FastIO;
int n,k,a[N+5],ee,lnk[N+5];struct edge {int to,nxt;}e[2*N+5];
struct Mat
{
	int n,m;LL a[K][K];LL* operator [] (int x) {return a[x];}Cn LL* operator [] (int x) Cn {return a[x];}
	void Init(int x,int y) {n=x,m=y;for(int i=0;i<n;++i) for(int j=0;j<m;++j) a[i][j]=INF;}
	friend void operator *= (Mat& A,Mat B) {Mat t;t.Init(A.n,B.m);for(int i=0;i<t.n;++i) for(int j=0;j<t.m;++j) for(int k=0;k<B.n;++k) t[i][j]=min(t[i][j],A[i][k]+B[k][j]);A=t;}
}g[N+5][LN+1];
int w[N+5],D[N+5],f[N+5][LN+1];void Init(int x)
{
	int i,j;for(i=1;i<=LN&&(f[x][i]=f[f[x][i-1]][i-1]);++i) (g[x][i]=g[x][i-1])*=g[f[x][i-1]][i-1];
	for(w[x]=1e9,i=lnk[x];i;i=e[i].nxt) w[x]=min(w[x],a[e[i].to]);
	int y;for(i=lnk[x];i;i=e[i].nxt) if((y=e[i].to)^f[x][0]) {for(g[y][0].Init(k,k),j=0;j<k;++j) g[y][0][j][0]=a[x],j<k-1&&(g[y][0][j][j+1]=0);k==3&&(g[y][0][1][1]=w[x]),D[y]=D[f[y][0]=x]+1,Init(y);}
}
LL Q(int x,int y)
{
	D[x]<D[y]&&(swap(x,y),0);int i,j;Mat Sx,Sy;Sx.Init(1,k),Sy.Init(1,k),Sx[0][0]=a[x],Sy[0][0]=a[y];
	for(i=0;D[x]^D[y];++i) (D[x]^D[y])>>i&1&&(Sx*=g[x][i],x=f[x][i]);if(x==y) return Sx[0][0];
	for(i=0;i<=LN&&f[x][i]^f[y][i];++i);for(--i;~i;--i) f[x][i]^f[y][i]&&(Sx*=g[x][i],Sy*=g[y][i],x=f[x][i],y=f[y][i]);
	LL t=INF;for(i=0;i<k;++i) for(j=0;j<k;++j) t=min(t,Sx[0][i]+Sy[0][j]);t+=a[f[x][0]];
	k==3&&(t=min(t,Sx[0][1]+Sy[0][1]+w[f[x][0]]));
	for(i=0;i<k;++i) for(j=0;i+j+2<=k;++j) t=min(t,Sx[0][i]+Sy[0][j]);return t;
}
int main()
{
	freopen("transmit.in","r",stdin),freopen("transmit.out","w",stdout);
	int Qt,i,x,y;for(read(n),read(Qt),read(k),i=1;i<=n;++i) read(a[i]);
	for(i=1;i^n;++i) read(x),read(y),add(x,y),add(y,x);Init(1);
	while(Qt--) read(x),read(y),writeln(Q(x,y));return clear(),0;
}

No.2

holiday.cpp

#include<bits/stdc++.h>
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memset(x,y,sizeof(x))
#define R(n) (rnd()%n)
#define PB push_back
using ll=long long;using db=double;using ull =unsigned long long;using lb=long db;using namespace std;
const int N=2500+5,M=4e5+5,INF=1e9;const db eps=1e-5;
int n,m,k,d[N][N],A[N][N],H[N];ll Ans,W[N];queue<int> Q;vector<int> S[N];
bool cmp(int x,int y){return W[x]>W[y];}
int main(){
	freopen("holiday.in","r",stdin);freopen("holiday.out","w",stdout);
	int i,j,x,y;scanf("%d%d%d",&n,&m,&k);for(i=2;i<=n;i++)scanf("%lld",&W[i]);while(m--) scanf("%d%d",&x,&y),S[x].PB(y),S[y].PB(x);
	for(i=1;i<=n;i++){
		Me(d[i],0x3f);d[i][i]=0;Q.push(i);while(!Q.empty()){
			int x=Q.front();Q.pop();for(int j:S[x])d[i][j]>d[i][x]+1&&(Q.push(j),d[i][j]=d[i][x]+1);
		}
	}
	for(i=2;i<=n;i++){
		for(j=2;j<=n;j++) i^j&&d[i][j]<=k+1&&d[1][j]<=k+1&&(A[i][++H[i]]=j);sort(A[i]+1,A[i]+H[i]+1,cmp);
	}
	for(i=2;i<=n;i++){
		for(j=2;j<=n;j++){if(d[i][j]>k+1||i==j) continue;
			for(x=1;x<=min(H[i],3);x++) for(y=1;y<=min(H[j],3);y++) if(A[i][x]^j&&A[i][x]^A[j][y]&&A[j][y]^i) Ans=max(Ans,W[i]+W[j]+W[A[i][x]]+W[A[j][y]]);
		}
	}printf("%lld\n",Ans);
	return 0;
}

game.cpp

#include<bits/stdc++.h>
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memset(x,y,sizeof(x))
#define R(n) (rnd()%n)
using ll=long long;using db=double;using ull =unsigned long long;using lb=long db;using namespace std;
const int N=1e5+5,M=4e5+5,INF=1e9+7;const db eps=1e-5;
int n,m,k,x,y,z,Hx,Hy;ll Ans,A[N],B[N],C[N],X[10],Y[10];
struct XS{
	int n,lg[N];ll st[N][20];
	void Init(int m,ll *A){int i,j;n=m;for(i=2;i<=n;i++) lg[i]=lg[i/2]+1;for(i=n;i;i--) for(st[i][0]=A[i],j=1;i+(1<<j)-1<=n;j++)  st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);}
	ll Qry(int x,int y){int d=lg[y-x+1];return max(st[x][d],st[y-(1<<d)+1][d]);}
}f1,f2,f3,f4;
struct IS{
	int n,lg[N];ll st[N][20];
	void Init(int m,ll *A){int i,j;n=m;for(i=2;i<=n;i++) lg[i]=lg[i/2]+1;for(i=n;i;i--) for(st[i][0]=A[i],j=1;i+(1<<j)-1<=n;j++)  st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);}
	ll Qry(int x,int y){int d=lg[y-x+1];return min(st[x][d],st[y-(1<<d)+1][d]);}
}g1,g2,g3,g4;
int main(){
	freopen("game.in","r",stdin);freopen("game.out","w",stdout);
	int i,j;scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;i++) scanf("%lld",&A[i]);for(i=1;i<=m;i++) scanf("%lld",&B[i]);
	f1.Init(n,A);g1.Init(n,A);for(i=1;i<=n;i++) C[i]=(A[i]<=0?A[i]:-INF);f2.Init(n,C);for(i=1;i<=n;i++) C[i]=(A[i]>=0?A[i]:INF);g2.Init(n,C);
	f3.Init(m,B);g3.Init(m,B);for(i=1;i<=m;i++) C[i]=(B[i]<=0?B[i]:-INF);f4.Init(m,C);for(i=1;i<=m;i++) C[i]=(B[i]>=0?B[i]:INF);g4.Init(m,C);
	while(k--){
		scanf("%d%d",&x,&y);X[1]=f1.Qry(x,y);X[2]=g1.Qry(x,y);Hx=2;if(X[2]<=0) X[++Hx]=f2.Qry(x,y);if(X[1]>=0) X[++Hx]=g2.Qry(x,y);
		scanf("%d%d",&x,&y);Y[1]=f3.Qry(x,y);Y[2]=g3.Qry(x,y);Hy=2;if(Y[2]<=0) Y[++Hy]=f4.Qry(x,y);if(Y[1]>=0) Y[++Hy]=g4.Qry(x,y);
		Ans=-1e18-7;for(i=1;i<=Hx;i++){
			ll Ts=1e18+7;for(j=1;j<=Hy;j++) Ts=min(Ts,X[i]*Y[j]);Ans=max(Ans,Ts);
		}printf("%lld\n",Ans);
	}
	return 0;
}

galaxy.cpp

#include<bits/stdc++.h>
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memset(x,y,sizeof(x))
#define R(n) (rnd()%n)
#define PB push_back
#define Gc() getchar()
using ll=long long;using db=double;using ull =unsigned long long;using lb=long db;using namespace std;
const int N=5e5+5,M=4e5+5,INF=1e9,M1=998244353,M2=1e9+7,B1=500009,B2=500029;const db eps=1e-5;
int n,m,k,op,x,y,z,Ps[N];vector<int> S[N],Is[N],Ds[N];ll P1[N],P2[N],T1,T2,Ans1,Ans2;
void Ins(int x){m++;T1=(T1+P1[x])%M1;T2=(T2+P2[x])%M2;}
void Del(int x){m--;T1=(T1+M1-P1[x])%M1;T2=(T2+M2-P2[x])%M2;}
void read(int &x){x=0;char c=Gc();while(c<'0'||c>'9') c=Gc();while(c>='0'&&c<='9') x=x*10+c-48,c=Gc();}
int main(){
	freopen("galaxy.in","r",stdin);freopen("galaxy.out","w",stdout);
	int i;scanf("%d%d",&n,&m);for(P1[0]=P2[0]=i=1;i<=n;i++) P1[i]=P1[i-1]*B1%M1,P2[i]=P2[i-1]*B2%M2,Ans1=(Ans1+P1[i])%M1,Ans2=(Ans2+P2[i])%M2;
	for(i=1;i<=m;i++) read(x),read(y),S[y].PB(x),Ins(x),m--;for(i=1;i<=n;i++) Ps[i]=1;
	scanf("%d",&k);while(k--){
		read(op);read(x);if(op==1){read(y);Del(x);Ds[y].PB(x);}
		else if(op==2){if(Ps[x]==1)for(int i:S[x]) Del(i);Ps[x]=-1;for(int i:Is[x]) Del(i);for(int i:Ds[x]) Ins(i);Is[x].clear();Ds[x].clear();}
		else if(op==3){read(y);Is[y].PB(x);Ins(x);}
		else {if(Ps[x]==-1)for(int i:S[x]) Ins(i);Ps[x]=1;for(int i:Is[x]) Del(i);for(int i:Ds[x]) Ins(i);Is[x].clear();Ds[x].clear();}
		if(m==n)puts(T1==Ans1&&T2==Ans2?"YES":"NO");else puts("NO");
	}
	return 0;
}

transmit.cpp

#include<bits/stdc++.h>
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memset(x,y,sizeof(x))
#define R(n) (rnd()%n)
#define PB push_back
using ll=long long;using db=double;using ull =unsigned long long;using lb=long db;using namespace std;
const int N=2e5+5,M=4e5+5,INF=1e9;const db eps=1e-5;
int n,m,k,x,y,z,W[N];vector<int> S[N];
namespace LCA{
	int d[N],lg[N],fa[N][20];
	void dfs(int x,int La){d[x]=d[La]+1;fa[x][0]=La;for(int i=1;fa[x][i-1];i++) fa[x][i]=fa[fa[x][i-1]][i-1];for(int i:S[x]) i^La&&(dfs(i,x),0);} 
	void BD(){for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;dfs(1,0);}
	int LCA(int x,int y){d[x]<d[y]&&(swap(x,y),0);while(d[x]^d[y]) x=fa[x][lg[d[x]-d[y]]];if(x==y) return x;for(int i=lg[d[x]];~i;i--) fa[x][i]^fa[y][i]&&(x=fa[x][i],y=fa[y][i]);return fa[x][0];}
	int Kth(int x,int k){while(k) x=fa[x][lg[k&-k]],k-=k&-k;return x;}
}
namespace Solve1{
	ll d[N];int fa[N];
	void Make(int x,int La){fa[x]=La;d[x]=d[La]+W[x];for(int i:S[x]) i^La&&(Make(i,x),0);}
	void Solve(){
		Make(1,0);while(m--){
			scanf("%d%d",&x,&y);int Ls=LCA::LCA(x,y);printf("%lld\n",d[x]+d[y]-d[Ls]-d[fa[Ls]]);
		}
	}
}
namespace Solve2{const int N=8e3+5;
	ll d[N];queue<int> Q;vector<int> G[N];
	void Solve(){
		int i,j;for(i=1;i<=k;i++){
			for(j=1;j<=n;j++){G[j].PB(j+i*n);for(int h:S[j]) G[j+i*n].PB(h+(i-1)*n);}
		}
		while(m--){
			scanf("%d%d",&x,&y);Me(d,0x3f);d[x]=W[x];Q.push(x);while(!Q.empty()){
				int x=Q.front();Q.pop();for(int i:G[x]) d[i]>d[x]+W[i]&&(Q.push(i),d[i]=d[x]+W[i]);
			}
			printf("%lld\n",d[y]);
		}
	}
}
int main(){
	freopen("transmit.in","r",stdin);freopen("transmit.out","w",stdout);
	int i,j;scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;i++) scanf("%d",&W[i]);for(i=1;i<n;i++)scanf("%d%d",&x,&y),S[x].PB(y),S[y].PB(x);LCA::BD();
	if(k==1) Solve1::Solve();else Solve2::Solve();
}

No.3

holiday.cpp

#include<bits/stdc++.h>
#define W while
#define I inline
#define RI int
#define Cn const
#define CI Cn int&
#define LL long long 
using namespace std;
Cn int N=2500+10,M=10000+10,TT=4;
int n,m,K,F[N];LL Ans,a[N];
bool T[N][N];
vector<int> G[N],H[N],Y[N];
#define pb push_back
queue<int> q;
I void BFS(CI x){
	W(!q.empty()) q.pop();
	RI u;memset(F,63,sizeof(F)),F[x]=0,q.push(x);W(!q.empty())
		if(u=q.front(),H[x].pb(u),T[x][u]=1,q.pop(),F[u]<=K) for(auto i:G[u]) F[i]>F[u]+1&&(F[i]=F[u]+1,q.push(i),0);
}
I bool cmp(CI x,CI y){return a[x]>a[y];}
I bool Calc(CI A,CI B,CI C,CI D){
	if(A==C||A==D||B==C||B==D) return 0;
	if(!(1^A&&1^B&&1^C&&1^D&&A^B&&A^C&&A^D&&B^C&&B^D&&C^D)) assert(0);
	assert(T[1][A]&&T[A][B]&&T[B][C]&&T[C][D]&&T[D][1]);
	Ans=max(Ans,a[A]+a[B]+a[C]+a[D]);
	return 1;
}
int main(){
	freopen("holiday.in","r",stdin);freopen("holiday.out","w",stdout);
	RI i,j,k,t,x,y;for(scanf("%d%d%d",&n,&m,&K),i=2;i<=n;i++) scanf("%lld",&a[i]);
	for(i=1;i<=m;i++) scanf("%d%d",&x,&y),G[x].pb(y),G[y].pb(x);
	for(i=1;i<=n;i++) BFS(i);
	for(i=2;i<=n;i++) for(auto j:H[i]) if(i^j&&j^1&&T[1][j]) Y[i].pb(j);
	for(i=2;i<=n;i++) sort(Y[i].begin(),Y[i].end(),cmp);
	for(i=2;i<=n;i++)//B
		for(auto j:H[i]) if(i<j&&j^1){
			x=0;
			for(k=0;k<=min(TT,(int)Y[i].size()-1);k++) for(t=0;!x&&t<=min(TT,(int)Y[j].size()-1);t++) x|=Calc(Y[i][k],i,j,Y[j][t]);
		}
	return printf("%lld\n",Ans),0;
}

game.cpp

#include<bits/stdc++.h>
#define W while
#define I inline
#define RI int
#define Cn const
#define CI Cn int&
#define LL long long 
using namespace std;
Cn int N=1e5+10,LG=20,inf=2e9;
int n,m,q,A[N],B[N],MX[N][LG],MN[N][LG],Lg[N],F1[N],F2[N],F3[N],F4[N],F5[N],F6[N],CNTA[N],CNTB[N];
/*
1 : postive
0 : negative
*/
I int QM(CI l,CI r){RI k=Lg[r-l+1];return max(MX[l][k],MX[r-(1<<k)+1][k]);}
I int QN(CI l,CI r){RI k=Lg[r-l+1];return min(MN[l][k],MN[r-(1<<k)+1][k]);}
struct Que{int l1,r1,l2,r2;}Q[N];
#define gc getchar
I void read(int& x){x=0;RI f=1;char c=gc();W(!isdigit(c)) f=c=='-'?-1:1,c=gc();W(isdigit(c)) x=x*10+c-'0',c=gc();return void(x*=f);}
int main(){
	freopen("game.in","r",stdin),freopen("game.out","w",stdout);
	RI i,j,x;for(read(n),read(m),read(q),Lg[0]=-1,i=1;i<=n;i++) read(A[i]),Lg[i]=Lg[i>>1]+1,CNTA[i]=CNTA[i-1]+(A[i]==0);
	for(i=1;i<=m;i++) read(B[i]),CNTB[i]=CNTB[i-1]+(B[i]==0);
	for(i=1;i<=m;i++) MX[i][0]=MN[i][0]=B[i];
	for(j=1;j<LG;j++) for(i=1;i+(1<<j)-1<=m;i++)
		MX[i][j]=max(MX[i][j-1],MX[i+(1<<j-1)][j-1]),MN[i][j]=min(MN[i][j-1],MN[i+(1<<j-1)][j-1]);
	for(i=1;i<=q;i++) read(Q[i].l1),read(Q[i].r1),read(Q[i].l2),read(Q[i].r2),F1[i]=QM(Q[i].l2,Q[i].r2),F2[i]=QN(Q[i].l2,Q[i].r2);
	for(i=1;i<=n;i++) MN[i][0]=A[i]>0?A[i]:inf,MX[i][0]=A[i]<0?A[i]:-inf;
	for(j=1;j<LG;j++) for(i=1;i+(1<<j)-1<=n;i++)
		MX[i][j]=max(MX[i][j-1],MX[i+(1<<j-1)][j-1]),MN[i][j]=min(MN[i][j-1],MN[i+(1<<j-1)][j-1]);
	for(i=1;i<=q;i++) F3[i]=QM(Q[i].l1,Q[i].r1),F4[i]=QN(Q[i].l1,Q[i].r1);
	for(i=1;i<=n;i++) MX[i][0]=A[i]>0?A[i]:-inf,MN[i][0]=A[i]<0?A[i]:inf;
	for(j=1;j<LG;j++) for(i=1;i+(1<<j)-1<=n;i++)
		MX[i][j]=max(MX[i][j-1],MX[i+(1<<j-1)][j-1]),MN[i][j]=min(MN[i][j-1],MN[i+(1<<j-1)][j-1]);
	for(i=1;i<=q;i++) F5[i]=QM(Q[i].l1,Q[i].r1),F6[i]=QN(Q[i].l1,Q[i].r1);
	for(i=1;i<=q;i++){
		LL Ans=-1LL*inf*inf;
		//A[i]>0
		if(F2[i]<0) F4[i]^inf&&(Ans=1LL*F2[i]*F4[i],0);
		else if(F2[i]>0) F5[i]^-inf&&(Ans=1LL*F2[i]*F5[i],0);
		//A[i]<0
		if(F1[i]>0) F3[i]^-inf&&(Ans=max(Ans,1LL*F1[i]*F3[i]),0);
		else if(F1[i]<0) F6[i]^inf&&(Ans=max(Ans,1LL*F1[i]*F6[i]),0);
		//B[i]=0 or A[i]=0
		if(CNTB[Q[i].r2]-CNTB[Q[i].l2-1]>0) Ans=min(Ans,0LL);
		if(CNTA[Q[i].r1]-CNTA[Q[i].l1-1]>0) Ans=max(Ans,0LL);
		printf("%lld\n",Ans);
	}return 0;
}

galaxy.cpp

#include<bits/stdc++.h>
#define W while
#define I inline
#define RI int
#define Cn const
#define CI Cn int&
#define LL long long 
using namespace std;
Cn int N=5e5+10;
#define gc getchar
I void read(int& x){x=0;RI f=1;char c=gc();W(!isdigit(c)) f=c=='-'?-1:1,c=gc();W(isdigit(c)) x=x*10+c-'0',c=gc();return void(x*=f);}
int n,m,q,out[N],in[N],CntO,CntI[N];
set<int> G[N],F[N],D[N];
#define pb push_back
I void ModI(CI x,CI v){
	CntI[in[x]]--;
	in[x]+=v;
	CntI[in[x]]++;
}
I void ModO(CI x,CI v){
	CntO-=(out[x]==1);
	out[x]+=v;
	CntO+=(out[x]==1);
}
I void Add(CI x,CI y){
	D[y].erase(x),G[x].insert(y),F[y].insert(x),ModI(y,1),ModO(x,1);
}
I void Del(CI x,CI y){
	D[y].insert(x),G[x].erase(y),F[y].erase(x),ModI(y,-1),ModO(x,-1);
}
I void Del(CI x){
	vector<int> v;
	for(auto i:F[x]) v.pb(i);
	for(auto i:v) Del(i,x);
}
I void Add(CI x){
	vector<int> v;
	for(auto i:D[x]) v.pb(i);
	for(auto i:v) Add(i,x);
}
I bool Q(){if(CntO^n) return 0;return 1;}
int main(){
	freopen("galaxy.in","r",stdin);freopen("galaxy.out","w",stdout);
	RI i,x,y,o;for(read(n),read(m),CntI[0]=n,i=1;i<=m;i++) read(x),read(y),Add(x,y);
	for(read(q),i=1;i<=q;i++){
		read(o),o==1?read(x),read(y),Del(x,y):o==2?read(x),Del(x):o==3?read(x),read(y),Add(x,y):(read(x),Add(x));
		puts(Q()?"YES":"NO");
	}return 0;
}

transmit.cpp

#include<bits/stdc++.h>
#define W while
#define I inline
#define RI int
#define Cn const
#define CI Cn int&
#define LL long long 
using namespace std;
Cn int N=2e5+10,LG=20;Cn LL inf=2e18;
#define gc getchar
I void read(int& x){x=0;RI f=1;char c=gc();W(!isdigit(c)) f=c=='-'?-1:1,c=gc();W(isdigit(c)) x=x*10+c-'0',c=gc();return void(x*=f);}
int n,q,k,a[N],d[N],f[N][LG];LL g[N],h[N],p[N];
vector<int> G[N],v,tg;
#define pb push_back
I void DFS(CI x,CI fa){d[x]=d[f[x][0]=fa]+1,g[x]=g[fa]+a[x];for(auto i:G[x]) i^fa&&(DFS(i,x),0);}
I int lca(RI x,RI y){
	RI i;for(d[x]<d[y]&&(swap(x,y),0),i=LG-1;~i;i--) d[f[x][i]]>=d[y]&&(x=f[x][i]);if(x==y) return x;
	for(i=LG-1;~i;i--) f[x][i]^f[y][i]&&(x=f[x][i],y=f[y][i]);return f[x][0];
}
I LL DistA(CI x,CI y){RI t=lca(x,y);return g[x]+g[y]-2LL*g[t];}
I void Jump(RI x,CI rt){W(x^rt) v.pb(x),x=f[x][0];}
int main(){
	freopen("transmit.in","r",stdin),freopen("transmit.out","w",stdout);
	RI i,j,t,x,y;for(read(n),read(q),read(k),i=1;i<=n;i++) read(a[i]),p[i]=inf;
	for(i=1;i<n;i++) read(x),read(y),G[x].pb(y),G[y].pb(x),p[x]=min(p[x],1LL*a[y]),p[y]=min(p[y],1LL*a[x]);
	for(DFS(1,0),j=1;j<LG;j++) for(i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1];
	if(k==1){for(i=1;i<=q;i++) read(x),read(y),printf("%lld\n",DistA(x,y));return 0;}
	for(i=1;i<=q;i++){
		read(x),read(y),t=lca(x,y);
		v.clear(),Jump(x,t),v.pb(t),tg=v;
		v.clear(),Jump(y,t),reverse(v.begin(),v.end());
		for(auto j:v) tg.pb(j);
		for(h[0]=a[tg[0]],j=1;j<tg.size();j++){
			for(h[j]=inf,t=1;t<=min(j,k);t++) h[j]=min(h[j],h[j-t]);
			if(k==3&&j>=4) h[j]=min(h[j],h[j-4]+p[tg[j-2]]);
			h[j]+=a[tg[j]];
		}printf("%lld\n",h[tg.size()-1]);
	}return 0;
}

No.4

holiday.cpp

#include<bits/stdc++.h>
using namespace std;using ll=long long;const int N=2.5e3+10;
int n,m,k,dis[N][N];ll ans,a[N];struct zj{ll x;int id;}f[N][4];vector<int>A[N];
void bfs(int s,int *dis){
	queue<int>q;q.push(s);dis[s]=0;for(int u;!q.empty();){
		u=q.front();q.pop();for(int v:A[u])if(!~dis[v])dis[v]=dis[u]+1,q.push(v);
	}
}
void ins(int i,int j,ll x){f[j][3]={x,i};sort(f[j],f[j]+4,[](zj x,zj y){return x.x>y.x;});}
bool chk(int A,int B,int C,int D){return A&&B&&C&&D&&A^B&&A^C&&A^D&&B^C&&B^D&&C^D;}
int main(){
	freopen("holiday.in","r",stdin);freopen("holiday.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);k++;for(int i=2;i<=n;i++)scanf("%lld",&a[i]);
	for(int u,v;m--;)scanf("%d%d",&u,&v),A[u].push_back(v),A[v].push_back(u);
	memset(dis,-1,sizeof dis);for(int i=1;i<=n;i++)bfs(i,dis[i]);
	for(int i=2;i<=n;i++)if(dis[1][i]<=k)for(int j=2;j<=n;j++)if(i^j&&dis[i][j]<=k)ins(i,j,a[i]+a[j]);
	for(int B=2;B<=n;B++)for(int C=B+1;C<=n;C++)if(dis[B][C]<=k)for(int i=0;i<3;i++)for(int j=0;j<3;j++)
		if(chk(f[B][i].id,B,C,f[C][j].id))ans=max(ans,f[B][i].x+f[C][j].x);cout<<ans;return 0;
}

game.cpp

#include<bits/stdc++.h>
using namespace std;using ll=long long;const int N=1e5+10,K=__lg(N)+2,INF=1e9+1;
int n,m,q,k,mn,mx,a[N],b[N],s[N],tmp[10],f1[K][N],f2[K][N],f3[K][N],f4[K][N],g1[K][N],g2[K][N];
int F1(int l,int r){int k=__lg(r-l+1);return min(f1[k][l],f1[k][r-(1<<k)+1]);}
int F2(int l,int r){int k=__lg(r-l+1);return max(f2[k][l],f2[k][r-(1<<k)+1]);}
int F3(int l,int r){int k=__lg(r-l+1);return max(f3[k][l],f3[k][r-(1<<k)+1]);}
int F4(int l,int r){int k=__lg(r-l+1);return min(f4[k][l],f4[k][r-(1<<k)+1]);}
int G1(int l,int r){int k=__lg(r-l+1);return max(g1[k][l],g1[k][r-(1<<k)+1]);}
int G2(int l,int r){int k=__lg(r-l+1);return min(g2[k][l],g2[k][r-(1<<k)+1]);}
void solve(int l,int r,int x,int y){
	k=0;int t=F1(l,r),mx=G1(x,y),mn=G2(x,y);if(t<0)tmp[++k]=t;t=F2(l,r);if(t>-INF)tmp[++k]=t;
	t=F3(l,r);if(t>0)tmp[++k]=t;t=F4(l,r);if(t<INF)tmp[++k]=t;if(s[r]-s[l-1]>0)tmp[++k]=0;ll ans=-2e18;
	for(int i=1;i<=k;i++)ans=max(ans,min(1ll*tmp[i]*mx,1ll*tmp[i]*mn));printf("%lld\n",ans);
}
int main(){
	freopen("game.in","r",stdin);freopen("game.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i]=s[i-1]+!a[i];
	for(int i=1;i<=m;i++)scanf("%d",&b[i]),g1[0][i]=g2[0][i]=b[i];
	for(int i=1;i<=n;i++)if(a[i]<0)f1[0][i]=f2[0][i]=a[i];else f2[0][i]=-INF;
	for(int i=1;i<=n;i++)if(a[i]>0)f3[0][i]=f4[0][i]=a[i];else f4[0][i]=INF;
	for(int i=1;(1<<i)<=n;i++)for(int j=1;j+(1<<i)-1<=n;j++)
		f1[i][j]=min(f1[i-1][j],f1[i-1][j+(1<<i-1)]),f2[i][j]=max(f2[i-1][j],f2[i-1][j+(1<<i-1)]),
		f3[i][j]=max(f3[i-1][j],f3[i-1][j+(1<<i-1)]),f4[i][j]=min(f4[i-1][j],f4[i-1][j+(1<<i-1)]);
	for(int i=1;(1<<i)<=m;i++)for(int j=1;j+(1<<i)-1<=m;j++)
		g1[i][j]=max(g1[i-1][j],g1[i-1][j+(1<<i-1)]),g2[i][j]=min(g2[i-1][j],g2[i-1][j+(1<<i-1)]);
	for(int l,r,x,y;q--;)scanf("%d%d%d%d",&l,&r,&x,&y),solve(l,r,x,y);return 0;
}

galaxy.cpp

#include<bits/stdc++.h>
using namespace std;using ll=long long;const int N=5e5+10;
int n,m,q;struct edges{int u,v;}e[N];struct ops{int op,u,v;}o[N];
namespace Solve1{
	const int N=1e3+10;
	int cnt[N],now;bitset<N>vis[N],tag[N];
	void solve(){
		for(int i=1;i<=m;i++)cnt[e[i].u]++,vis[e[i].u][e[i].v]=1,tag[e[i].u][e[i].v]=1;
		for(int i=1;i<=n;i++)now+=cnt[i]==1;for(int op,u,v,i=1;i<=q;i++){
			op=o[i].op;u=o[i].u;v=o[i].v;if(op==1){
				tag[u][v]=0;now-=cnt[u]==1;now+=--cnt[u]==1;
			}else if(op==2){
				for(int i=1;i<=n;i++)if(tag[i][u])now-=cnt[i]==1,now+=--cnt[i]==1,tag[i][u]=0;
			}else if(op==3){
				tag[u][v]=1;now-=cnt[u]==1;now+=++cnt[u]==1;
			}else for(int i=1;i<=n;i++)if(vis[i][u]&&!tag[i][u])
				now-=cnt[i]==1,now+=++cnt[i]==1,tag[i][u]=1;
			puts(now==n?"YES":"NO");
		}cerr<<"Solve1";
	}
}
namespace Solve2{
	int cnt[N],now;map<pair<int,int>,int>f;
	void solve(){
		for(int i=1;i<=m;i++)cnt[e[i].u]++,f[{e[i].u,e[i].v}]=i;
		for(int i=1;i<=n;i++)now+=cnt[i]==1;for(int op,u,i=1;i<=q;i++){
			op=o[i].op;u=o[i].u;if(op==1){
				now-=cnt[u]==1;now+=--cnt[u]==1;
			}else if(op==3){
				now-=cnt[u]==1;now+=++cnt[u]==1;
			}puts(now==n?"YES":"NO");
		}cerr<<"Solve2";
	}
}
namespace Solve3{
	vector<pair<int,int> >in[N],to[N];map<pair<int,int>,int>f;set<int>g[N][2];
	int sum,B,tot[N],node[N],vis[N],edge[N],tag[N];bitset<N>ans;
	void merge(set<int>&x,set<int>&y){
		if(x.size()<y.size())x.swap(y);
		for(auto t:y)x.insert(t);y.clear();
	}
	bool chk(ops x,ops y){
		if(x.op>y.op)swap(x,y);
		if(x.op==1&&y.op==3){
			return (x.u==y.u&&x.v==y.v)||(x.v==y.u&&x.u==y.v);
		}if(x.op==2&&y.op==4)return x.u==y.u;return 0;
	}
	void solve(){
		for(int i=1;i<=m;i++){
			sum++,in[e[i].v].push_back({e[i].u,i});
			f[{e[i].u,e[i].v}]=i;tag[i]=1;
			g[e[i].v][1].insert(i);
		}for(int i=1;i<=n;i++)vis[i]=1;
		B=sqrt(q);
		int ttt=0;
		for(int i=1,u,v,op,id;i<=q;i++){
			op=o[i].op;u=o[i].u;v=o[i].v;
			if(op==1){
				id=f[{u,v}];edge[id]=i;tag[id]=0;
				sum--;g[v][1].erase(id);g[v][0].insert(id);
			}else if(op==2){
				sum-=g[u][1].size();node[u]=i;vis[u]=0;
				merge(g[u][0],g[u][1]);
			}else if(op==3){
				id=f[{u,v}];edge[id]=i;tag[id]=1;
				sum++;g[v][0].erase(id);g[v][1].insert(id);
			}else{
				sum+=g[u][0].size();node[u]=i;vis[u]=1;
				merge(g[u][1],g[u][0]);
			}
			if(sum!=n)ans[i]=0,puts("NO");
			else{
				ttt++;
				memset(tot,0,sizeof tot);
				for(int i=1,u,v;i<=m;i++){
					u=e[i].u;v=e[i].v;
					if(edge[i]<node[v])tot[u]+=vis[v];
					else tot[u]+=tag[i];
				}
				bool flag=1;
				for(int i=1;i<=n;i++)flag&=tot[i]==1;
				ans[i]=flag;puts(flag?"YES":"NO");
			}
			if(i>1&&i+2<=q&&chk(o[i-1],o[i])&&chk(o[i],o[i+1])&&chk(o[i+1],o[i+2])){
				ans[i+1]=ans[i-1];ans[i+2]=ans[i];
				puts(ans[i+1]?"YES":"NO");
				puts(ans[i+2]?"YES":"NO");
				i+=2;continue;
			}
		}cerr<<"Solve3:"<<ttt;
	}
}
void read(int &x){char c;for(;!isdigit(c=getchar()););for(;x=(x<<3)+(x<<1)+(c^48),isdigit(c=getchar()););}
int main(){
	freopen("galaxy.in","r",stdin);freopen("galaxy.out","w",stdout);
	read(n);read(m);for(int i=1;i<=m;i++)read(e[i].u),read(e[i].v);
	bool flag=1;
	read(q);for(int i=1;i<=q;i++){
		read(o[i].op);read(o[i].u);if(o[i].op&1)read(o[i].v);else flag=0;
	}
	if(n<=1000&&m<=10000&&q<=1000)return Solve1::solve(),0;
	if(flag)return Solve2::solve(),0;
	return Solve3::solve(),0;
}

transmit.cpp

#include<bits/stdc++.h>
using namespace std;using ll=long long;const int N=2e5+10,M=3,K=__lg(N)+2;
int n,m,k,a[N],dep[N],f[K][N];ll d1[N],d2[N];vector<int>A[N];
struct matrix{
	ll a[M][M];matrix(){memset(a,0x3f,sizeof a);}
	matrix operator * (const matrix &x)const{
		matrix b;for(int p=0;p<k;p++)for(int i=0;i<k;i++)for(int j=0;j<k;j++)
			b.a[i][j]=min(b.a[i][j],a[i][p]+x.a[p][j]);return b;
	}
}g[K][N];
struct vec{
	ll a[M];vec(){memset(a,0x3f,sizeof a);}
	vec operator * (const matrix &x)const{
		vec b;for(int i=0;i<k;i++)for(int j=0;j<k;j++)b.a[j]=min(b.a[j],a[i]+x.a[i][j]);return b;
	}
};
void dfs(int u){for(int v:A[u])if(v^f[0][u])f[0][v]=u,dep[v]=dep[u]+1,dfs(v);}
ll solve(int u,int v){
	if(dep[u]<dep[v])swap(u,v);vec tu,tv;tu.a[0]=a[u];tv.a[0]=a[v];
	for(int i=K-1;~i;i--)if(dep[f[i][u]]>=dep[v])tu=tu*g[i][f[0][u]],u=f[i][u];if(u==v)return tu.a[0];
	for(int i=K-1;~i;i--)if(f[i][u]^f[i][v])tu=tu*g[i][f[0][u]],tv=tv*g[i][f[0][v]],u=f[i][u],v=f[i][v];
	matrix tmp=g[0][f[0][u]];if(k==3&&f[1][u])tmp.a[1][1]=min(tmp.a[1][1],(ll)a[f[1][u]]);
	if(k==3&&f[1][u])tmp.a[0][2]=min(tmp.a[0][2],d1[f[1][u]]);
	tu=tu*tmp;ll ans=1e18;for(int i=0;i<k;i++)for(int j=0;j<k;j++)if(i+j+1<=k)
		ans=min(ans,tu.a[i]+tv.a[j]);return ans;
}
int main(){
	freopen("transmit.in","r",stdin);freopen("transmit.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),A[u].push_back(v),A[v].push_back(u);
	dfs(dep[1]=1);memset(d1,0x3f,sizeof d1);memset(d2,0x3f,sizeof d2);
	for(int i=1;i<=n;i++)d1[f[0][i]]=min(d1[f[0][i]],(ll)a[i]),d2[f[0][f[0][i]]]=min(d2[f[0][f[0][i]]],(ll)a[i]);
	if(k==3){
		for(int i=1;i<=n;i++)g[0][i].a[0][0]=g[0][i].a[1][0]=g[0][i].a[2][0]=a[i],
			g[0][i].a[0][1]=g[0][i].a[1][2]=0,g[0][i].a[0][2]=d2[i],g[0][i].a[1][1]=d1[i];
	}else if(k==2)for(int i=1;i<=n;i++)g[0][i].a[0][0]=g[0][i].a[1][0]=a[i],g[0][i].a[0][1]=0;
	else for(int i=1;i<=n;i++)g[0][i].a[0][0]=a[i];
	for(int i=1;(1<<i)<=n;i++)for(int j=1;j<=n;j++)f[i][j]=f[i-1][f[i-1][j]],g[i][j]=g[i-1][j]*g[i-1][f[i-1][j]];
	for(int u,v;m--;)scanf("%d%d",&u,&v),printf("%lld\n",solve(u,v));return 0;
}
posted @ 2022-11-01 21:15  jiangtaizhe001  阅读(84)  评论(0编辑  收藏  举报