可爱萌新70pt求助
查看原帖
可爱萌新70pt求助
124918
LinkyChristian楼主2021/12/19 18:10

RT,70pt,【2,7,10】三个数据点WA

#include<bits/stdc++.h>
#define int long long
#define N 600010 
using namespace std;
int cnt=1,head[N],to[N],nxt[N],val[N];
int pn;
int n,m,Q;
void insert(int u,int v,int w) {
	cnt++;
	to[cnt]=v;
	val[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
priority_queue<pair<int,int> > q;
int disS[N],disT[N],INF=0x3f3f3f3f3f3f3f3f,lst[N],l[N],r[N];
int path[N],ind[N];
inline void Dij(int s,int dis[],int f=0) {
	for(int i=1; i<=n; i++) dis[i]=INF;
	q.push(make_pair(dis[s]=0,s));
	while(!q.empty()) {
	    int now=q.top().second;q.pop();
//	    cout<<now<<" ";
	    for(int i=head[now]; i; i=nxt[i])
	        if(dis[to[i]]>dis[now]+val[i]&&((f%2==1&&i%2==0)||(f%2==0&&i%2==1))) {
	        	dis[to[i]]=dis[now]+val[i];
	        	lst[to[i]]=i;
	        	if(f==1&&!path[to[i]]) l[to[i]]=l[now];
	        	if(f==2&&!path[to[i]]) r[to[i]]=r[now];
	        	q.push(make_pair(-dis[to[i]],to[i]));
			} 
	}
//	cout<<dis[1]<<endl;
}
int pid[N]; 
int tr[4*N];
void build(int k,int l,int r) {
	tr[k]=INF;
	if(l==r) return ;
	int mid=(l+r)/2;
	build(2*k,l,mid);
	build(2*k+1,mid+1,r);
}
void updata(int k,int l,int r,int L,int R,int num) {
	if(L>R) return ;
	if(L<=l&&r<=R) {
		tr[k]=min(tr[k],num);
		return ;
	}
	int mid=(l+r)/2;
	if(L<=mid) updata(2*k,l,mid,L,R,num);
	if(R>mid) updata(2*k+1,mid+1,r,L,R,num);
}
int query(int k,int l,int r,int pos) {
	if(l==r) return tr[k];
	int res=tr[k];
	int mid=(l+r)/2;
	if(pos<=mid) res=min(res,query(2*k,l,mid,pos));
	else res=min(res,query(2*k+1,mid+1,r,pos));
	return res;
}
signed main()
{
	memset(tr,0x3f,sizeof(tr));
	cin>>n>>m>>Q;
	for(int i=1; i<=m; i++) {
		int u,v,w;
		cin>>u>>v>>w;
		insert(u,v,w);
		insert(v,u,w);
	} 
	Dij(n,disT);
	for(int i=1; i<=Q; i++) cin>>pid[i];
	path[1]=1;
	l[1]=r[1]=0;
	int cur=1;
	for(int i=1; i<=Q; i++) {
		int id=pid[i];
		ind[id]=i;
		pn++;
		cur=to[id*2]^to[id*2+1]^cur;
		path[cur]=1;
		l[cur]=r[cur]=i;
	}
	Dij(1,disS,1);
	Dij(n,disT,2);
	build(1,1,pn);
	for(int i=1; i<=m; i++) if(!ind[i]) {
		int u=to[2*i],v=to[2*i+1],w=val[2*i];
//		updata(1,1,pn,l[u]+1,r[v],disS[u]+w+disT[v]);
		updata(1,1,pn,l[v]+1,r[u],disS[v]+w+disT[u]);
//		cout<<l[u]+1<<" "<<r[v]<<" "<<disS[u]+w+disT[v]<<endl;
//		cout<<l[v]+1<<" "<<r[u]<<" "<<disS[v]+w+disT[u]<<endl; 
	}
	for(int i=1; i<=Q; i++) {
		int id,x,ans=disS[n];
		id=pid[i];
		int u=to[id*2],v=to[id*2+1],w=val[id*2];
//		if(ind[id]) {
//			cout<<"in\n";
//			cout<<u<<" "<<v<<endl;
			ans=min(INF,query(1,1,pn,ind[id]));
//		} 
		cout<<ans<<endl;
	}
	return 0;
}
2021/12/19 18:10
加载中...