性感代码在线求调
查看原帖
性感代码在线求调
305891
Eraine楼主2024/1/18 19:30
#include<bits/stdc++.h>
#define ll long long
#define ll long long
using namespace std;
const int N=2e5+5;
const ll inf=1e18;
int n,m,q,L[N],R[N],imp[N],tracelen,impid[N];
bool impvis[N];
ll disS[N],disT[N];
bool vis[N];
vector<pair<pair<int,ll>,int> >E[N];
priority_queue<pair<ll,int> >Q;
void dijkstra(int s,ll dis[],int opt=0){
	for(int i=1;i<=n;i++){
		dis[i]=inf;
		vis[i]=0;
	}
	while(!Q.empty()){
		Q.pop();
	}
	dis[s]=0;
	Q.push(make_pair(-dis[s],s));
	while(!Q.empty()){
		int u=Q.top().second;
		Q.pop();
		if(vis[u]){
			continue;
		}
		vis[u]=1;
		for(int i=0;i<E[u].size();i++){
			int v=E[u][i].first.first;ll w=E[u][i].first.second;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				Q.push(make_pair(-dis[v],v));
				if(~impid[v]&&opt==1){
					L[v]=L[u];
				}
				if(~impid[v]&&opt==2){
					R[v]=R[u];
				}
			}else if(dis[v]==dis[u]+w){
				if(~impid[v]&&opt==1){
					L[v]=max(L[v],L[u]);
				}
				if(~impid[v]&&opt==2){
					R[v]=min(R[v],R[u]);
				}
			}
		}
	}
}
void getTrace(){
	memset(impid,-1,sizeof impid);
	int cur=1,cnt=0;
	impid[cur]=cnt;
	while(cur!=n){
		for(int i=0;i<E[cur].size();i++){
			int u=cur,v=E[cur][i].first.first,id=E[cur][i].second;ll w=E[cur][i].first.second;
			if(disT[u]!=disT[v]+w){
				continue;
			}
			cur=v;
			imp[++cnt]=cur;
			impid[cur]=cnt;
			L[cur]=R[cur]=cnt;
			impvis[id]=1;
			break;
		}
	}
	tracelen=cnt;
}
namespace SGT{
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
	struct node{
		int ch[2];
		ll minn,lz;
		node(){
			minn=lz=inf;
		}
	}tr[N<<2];
	int idx;
	void build(int &i,int l,int r){
		i=++idx;
		if(l==r){
			return;
		}
		build(lc,l,mid);
		build(rc,mid+1,r);
	}
	void lazy(int i,ll val){
		tr[i].minn=min(tr[i].minn,val);
		tr[i].lz=min(tr[i].lz,val);
	}
	void pushdown(int i){
		lazy(lc,tr[i].lz);
		lazy(rc,tr[i].lz);
		tr[i].lz=inf;
	}
	void pushup(int i){
		tr[i].minn=min(tr[lc].minn,tr[rc].minn);
	}
	void modify(int i,int l,int r,int L,int R,ll val){
		if(L<=l&&R>=r){
			lazy(i,val);
			return;
		}
		pushdown(i);
		if(L<=mid){
			modify(lc,l,mid,L,R,val);
		}
		if(R>mid){
			modify(rc,mid+1,r,L,R,val);
		}
		pushup(i);
	}
	ll query(int i,int l,int r,int x){
		if(l==r){
			return tr[i].minn;
		}
		pushdown(i);
		if(x<=mid){
			return query(lc,l,mid,x);
		}else{
			return query(rc,mid+1,r,x);
		}
	}
#undef lc
#undef rc
#undef mid
}
struct edge{
	int u,v;ll w;
}e[N];
int rt;
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=m;i++){
		int u,v;ll w;
		scanf("%d%d%lld",&u,&v,&w);
		swap(u,v);
		E[u].push_back(make_pair(make_pair(v,w),i));
		E[v].push_back(make_pair(make_pair(u,w),i));
		e[i]=edge{u,v,w};
	}
	dijkstra(n,disT);
	getTrace();
	dijkstra(1,disS,1);
	dijkstra(n,disT,2);
	SGT::build(rt,1,tracelen);
	ll sp=disS[n];
	for(int u=1;u<=n;u++){
		for(int i=0;i<E[u].size();i++){
			int v=E[u][i].first.first,id=E[u][i].second;ll w=E[u][i].first.second;
			if(impvis[id]){
				continue;
			}
			if(L[u]+1>R[v]){
				continue;
			}
			SGT::modify(rt,1,tracelen,L[u]+1,R[v],disS[u]+disT[v]+w);
		}
	}
	for(int i=1;i<=q;i++){
		int pos;ll val;
		scanf("%d%lld",&pos,&val);
		int u=e[pos].u,v=e[pos].v;ll w=e[pos].w;
		ll res=0;
		if(impvis[pos]){
			if(impid[u]>impid[v]){
				swap(u,v);
			}
			if(val<=w){
				res=sp+(val-w);
			}else{
				res=min(sp+(val-w),SGT::query(rt,1,tracelen,impid[v]));
			}
		}else{
			if(val<=w){
				res=min(sp,min(disS[u]+disT[v],disS[v]+disT[u])+val);
			}else{
				res=sp;
			}
		}
		printf("%lld\n",res);
	}
	return 0;
}
2024/1/18 19:30
加载中...