0分求调
查看原帖
0分求调
315398
小杨小小杨楼主2024/10/11 13:22

全wa

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
struct Edge{int to,nex,val;}edge[N],x[N];
int Settt[N],head[N],f[N],flag[N],dep[N],st[N][40],St[N][40],q[N],b[N],tot,lg[N],ans,n,m,Q,gold;
bool cmp(Edge x,Edge y){return x.val>y.val;}
inline void ins(int x,int y,int val){edge[tot].to=y;edge[tot].nex=head[x];edge[tot].val=val;head[x]=tot++;}
inline int finds(int x){return (~f[x]?x:f[x]=finds(f[x]));}
inline void check(int x,int y,int val){
	int fx=finds(x),fy=finds(y);
	if (fx!=fy) f[fx]=fy,ins(fx,fy,val),ins(fy,fx,val);
}
void ST(int x,int fa){
	if (flag[x]) return;
	flag[x]=true;dep[x]=dep[fa]+1;st[0][x]=fa;
	for (int i=1;i<=lg[dep[x]]+1;i++) st[i][x]=st[i-1][st[i-1][x]],St[i][x]=min(St[i-1][x],St[i-1][st[i-1][x]]);
	for (int i=head[x];~i;i=edge[i].nex){int u=edge[i].to;if (u!=fa) St[0][u]=edge[i].val,ST(u,x);}
}
int lca(int x,int y){
	int mi=2e9;
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=lg[dep[x]]+1;i>=0;i--) if (dep[st[i][x]]>=dep[y]) mi=min(mi,St[i][x]),x=st[i][x];	
	if (x==y) return mi;
	for (int i=lg[dep[x]]+1;i>=0;i--) if (st[i][x]!=st[i][y]) mi=min(mi,min(St[i][x],St[i][y])),x=st[i][x],y=st[i][y];
	return min(mi,St[0][x]);
}
signed main(){
	scanf("%d%d%d",&n,&m,&Q);
	memset(f,-1,sizeof(f));memset(head,-1,sizeof(head));memset(St,0x3f,sizeof(St));
	for (int i=1;i<=n;i++) scanf("%d",&Settt[i]);
	for (int i=1;i<=n;i++) scanf("%d",&b[i]);
	for (int i=1;i<=m;i++) scanf("%d%d%d",&x[i].to,&x[i].nex,&x[i].val);
	for (int i=1;i<=Q;i++) scanf("%d",&q[i]);
	for (int i=1;i<Q;i++) check(q[i],q[i+1],1e10);
	sort(x+1,x+m+1,cmp);
	for (int i=1;i<=m;i++) check(x[i].to,x[i].nex,x[i].val);
	for (int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
	ST(1,0);if (b[Settt[1]]>0) gold=b[Settt[1]];else printf("0\n");
	for (int i=2;i<=n;i++){
		gold=min(gold,lca(Settt[i-1],Settt[i]));
		if (b[Settt[i]]>0) gold+=b[Settt[i]];
		else printf("%d\n",min(-b[Settt[i]],gold)),gold-=min(-b[Settt[i]],gold);
	}
	return 0;
}
2024/10/11 13:22
加载中...