链接:点击打开链接
题意:给出n个三元组(u,v,w),要求每个[u,v]区间内至少取w个整数,为最少需要几个整数能够满足所有的区间
代码:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int siz=50005;
const int INF=0x3f3f3f3f;
int d[siz],vis[siz];
struct node{
int to,val;
};
vector<node> G[siz];
int spfa(int S,int T){
int i,u,v,w;
for(i=S;i<=T;i++)
d[i]=-INF,vis[i]=0;
queue<int> qu;
qu.push(S);
d[S]=0,vis[S]=1;
while(qu.size()){
u=qu.front();
qu.pop();
vis[u]=0;
for(i=0;i<G[u].size();i++){
v=G[u][i].to;
w=G[u][i].val;
if(d[v]<d[u]+w){
d[v]=d[u]+w;
if(vis[v]==0){
vis[v]=1;
qu.push(v);
}
}
}
}
return d[T];
}
int main(){
int i,n,u,v,w,S,T; //s[i]表示数i之前选的数的个数的前缀和
while(scanf("%d",&n)!=EOF){ //则s[v]-s[u-1]>=w
for(i=0;i<siz;i++) //s[u+1]-s[u]>=0
G[i].clear(); //s[u]-s[u+1]>=-1
S=INF,T=-INF; //直接差分约束,有负边spfa求最长路
for(i=1;i<=n;i++){
scanf("%d%d%d",&u,&v,&w);
u++,v++; //因为u,v可能为0,避免出现负数
S=min(S,u-1);
T=max(T,v);
G[u-1].push_back((node){v,w});
}
for(i=S;i<T;i++){
G[i].push_back((node){i+1,0});
G[i+1].push_back((node){i,-1});
}
printf("%d\n",spfa(S,T));
}
return 0;
}

742

被折叠的 条评论
为什么被折叠?



