传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1520
费用流不解释
Code:
#include<bits/stdc++.h>
#define in(i) (i<<1)
#define out(i) (i<<1|1)
using namespace std;
const int maxn=410;
int n,s,t;
struct edge{
int u,v,cap,flow,cost;
edge(int _u=0,int _v=0,int _cap=0,int _flow=0,int _cost=0):
u(_u),v(_v),cap(_cap),flow(_flow),cost(_cost){}
};
vector<edge>edges;
vector<int>G[maxn];
int pre[maxn],a[maxn],d[maxn],vis[maxn],cost,flow;
void add(int u,int v,int cap,int cost){
edges.push_back(edge(u,v,cap,0,cost));
G[u].push_back(edges.size()-1);
edges.push_back(edge(v,u,0,0,-cost));
G[v].push_back(edges.size()-1);
}
bool spfa(){
queue<int>q;
q.push(s);
memset(d,0x4f,sizeof d);int B=d[0];d[s]=0;a[s]=INT_MAX;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=0;i<G[u].size();i++){
edge e=edges[G[u][i]];
if(e.cap>e.flow&&d[e.v]>d[u]+e.cost){
d[e.v]=d[u]+e.cost;
pre[e.v]=G[u][i];
a[e.v]=min(a[u],e.cap-e.flow);
if(!vis[e.v]){
vis[e.v]=1;
q.push(e.v);
}
}
}
}
if(d[t]==B)return false;
cost+=d[t]*a[t];
flow+=a[t];
for(int u=t;u!=s;u=edges[pre[u]].u){
edges[pre[u]].flow+=a[t];
edges[pre[u]^1].flow-=a[t];
}return true;
}
int m[maxn],l[maxn],r[maxn],k[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d%d%d",&m[i],&l[i],&r[i],&k[i]);
s=0,t=n*2+1;
for(int i=1;i<=n;i++){
add(s,i,1,0);
for(int j=l[i];j<=r[i];j++)
add(i,j+n,1,k[i]*abs(m[i]-j));
add(i+n,t,1,0);
}
while(spfa());
if(flow==n)
cout<<cost<<endl;
else puts("NIE");
return 0;
}