P12348 题解
Little_Cart · · 题解
前言
无内鬼,来点差分约束。
思路
一眼差分约束(或者流),但是流好像不太行,那还是差分约束吧。
注意到
直接暴力将
注意到我们可以在每次连边时建立一个中继点,先将
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
#define mkp make_pair
const int N=300024;
int t,n,m,tot;
vector<PII> e[N];
int dis[N],cnt[N];
queue<int> q;
bool spfa(){
while(!q.empty()){
q.pop();
}
for(int i=1;i<=n+m;i++){
q.push(i);
}
while(!q.empty()){
tot++;
int u=q.front();
q.pop();
if(cnt[u]>=m+n+2||tot>10000000){
return 0;
}
cnt[u]++;
for(PII tp:e[u]){
int v=tp.fi,w=tp.se;
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
q.push(v);
}
}
}
return 1;
}
signed main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
int l,r,x,y,w;
cin>>l>>r>>x>>y>>w;
for(int j=l;j<=r;j++){
e[j].push_back(mkp(n+i,-w));
}
for(int j=x;j<=y;j++){
e[n+i].push_back(mkp(j,0));
}
}
if(spfa()){
int mx=dis[1],mn=dis[1];
for(int i=2;i<=n+m;i++){
mx=max(mx,dis[i]);
mn=min(mn,dis[i]);
}
cout<<mx-mn;
}
else{
cout<<"No Solution";
}
}