求HACK
查看原帖
求HACK
750163
_Kenma_楼主2023/12/3 18:03

RT,T#16,人调麻了

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long op,s,t,l;
long long head[5005],nxt[20005],targetx[20005],targetw[20005],targetk[20005],pre[5005],tot;
long long mp[5005][5005];
bool vis[5005];
bool vis1[5005];
long long dis[5005],cnt[5005];
queue<long long> q;
int dfs(int x,int sum){
	if(vis1[x]) return sum;
	vis1[x]=1;
	return dfs(pre[x],sum+mp[pre[x]][x]); 
}
void add(long long x,long long y,long long w,long long k){
	tot++;
	nxt[tot]=head[x];
	head[x]=tot;
	targetx[tot]=y;
	targetw[tot]=w;
	targetk[tot]=k;
	mp[x][y]=k;
}
long long check(long long mid){
	for(long long i=1;i<=n;i++){
		dis[i]=1e17+10;
	}
	while(q.size()) q.pop();
	memset(vis,0,sizeof(vis));
	memset(cnt,0,sizeof(cnt));
	memset(pre,0,sizeof(pre));
	dis[1]=0;
	vis[1]=1;
	q.push(1);
	cnt[1]=1;
	while(q.size()){
		long long x=q.front();
		q.pop();
		vis[x]=0;
		for(long long i=head[x];i;i=nxt[i]){
			long long y=targetx[i],w=targetw[i],k=targetk[i];
			if(dis[x]+k*mid+w<dis[y]){
				dis[y]=dis[x]+k*mid+w;
				pre[y]=x;
				if(vis[y]) continue;
				vis[y]=1;
				q.push(y);
				if(++cnt[y]>n){
					memset(vis1,0,sizeof(vis1));
					int sum=dfs(y,0);
					if(sum>0) return 1;
					else return -1;
		        }
			}
		}
	} 
	return 0;
}
long long findr(long long l,long long r){
	if(l==r) return l;
	long long mid=(l+r+1)>>1;
	long long tp=check(mid);
	if(tp==1){
		return findr(mid+1,r);
	}else if(tp==-1){
		return findr(l,mid-1);
	}else{
		return findr(mid,r);
	}
}
long long findl(long long l,long long r){
	if(l==r) return l;
	long long mid=(l+r)>>1;
	long long tp=check(mid);
	if(tp==1){
		return findl(mid+1,r);
	}else if(tp==-1){
		return findl(l,mid-1);
	}else{
		return findl(l,mid);
	}
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n-1;i++){
		add(i+1,i,-1,0);
	}
	add(1,n,-1,1);
	for(long long i=1;i<=m;i++){
		cin>>op>>s>>t>>l;
		if(op==1){
			if(s<t){
				add(t,s,-l,0);
			}else{
				add(t,s,-l,1);
			}
		}else{
			if(s<t){
				add(s,t,l,0);
			}else{
				add(s,t,l,-1);
			}
		}
	}
	long long r=findr(0,1e12),l=findl(0,1e12);
	if(r==1e12){
		cout<<-1;
	}else{
		cout<<r-l+1;
	}
	return 0;
}
2023/12/3 18:03
加载中...