思路就是s[i] 表示前 i 包括i 的数中 选择了几个数
所以 s[i] >= s[i - 1]
题目输入的 a ,b c;
s[b] - s[a - 1] >= c;
利用这两个条件进行差分约束 然后 偏移量为1空出 a[0]为偏移点 就 可以直接得到 dist[50001] 为最终答案
#include<iostream>
#include<cstring>
using namespace std;
const int N = 5e5 + 10;
typedef long long LL;
int n,m;
int head[N],last[N * 3],to[N * 3],w[N * 3],cnt;
void add(int a,int b,int c){
to[++cnt] = b;
w[cnt] = c;
last[cnt] = head[a];
head[a] = cnt;
}
LL dist[N];int flag[N],q[N * 3];
bool spfa(){
memset(dist,-0x3f,sizeof dist);
memset(flag,0,sizeof flag);
int tt = 0,hh = 0;
q[++tt] = 0;
dist[0] = 0;
while(hh != tt){
int p = q[++hh];
if(hh == N - 1) hh = 0;
flag[p] = 0;
for(int i = head[p]; i != -1; i = last[i]){
if(dist[to[i]] < dist[p] + w[i]){
dist[to[i]] = dist[p] + w[i];
if(!flag[to[i]]){
flag[to[i]] = 1;
q[++tt] = to[i];
if(tt == N - 1) tt = 0;
}
}
}
}
return true;
}
int main(){
memset(head,-1,sizeof head);
scanf("%d",&n);
for(int i = 1; i <= n; i++){
int x,y,z;
cin >> x >> y >> z;
add(x,y + 1,z);
}
for(int i = 1; i <= 500001; i++){
add(i - 1, i,0);
add(i,i - 1,-1);
}
spfa();
cout << dist[50001] << endl;
return 0;
}