差分约束

include

include

using namespace std;
const int N=50010,M=150010;
int h[N],e[M],ne[M],w[M],idx;
int dist[N],n,q[N];
bool st[N];

void add(int a,int b,int c){
w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

void spfa(){
memset(dist,-0x3f,sizeof dist);
int tt=1,hh=0;
st[0]=true;
dist[0]=0;
q[0]=0;

while(hh!=tt){
    int t=q[hh++];
    if(hh==N) hh=0;
    st[t]=false;

    for(int i=h[t];~i;i=ne[i]){
        int j=e[i];
        if(dist[j]<dist[t]+w[i]){
            dist[j]=dist[t]+w[i];
            cnt[j] = cnt[t] + 1;
            if (cnt[j] >= n + 1) return 0;
            if(!st[j]){
                st[j]=true;
                q[tt++]=j;
                if(tt==N) tt=0;
            }
        }
    }
}

return 1;
}

int main(){
//额外设置一个s 表示1到s中选择的数的数量 最终结果是s50001,需要提前将ai,bi加1 将0空出来
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<=50001;i++){
//si>=si-1
add(i-1,i,0);
//si-si-1<=1 si-1>=si-1
add(i,i-1,-1);
}

for(int i=0;i<n;i++){
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    a++,b++;
    //区间[a,b]至少有c个数,sb-sa>=c sb>=sa+c
    add(a-1,b,c);
}

spfa();

cout<<dist[50001];
return 0;

}

posted on 2025-05-15 20:56  下头小美  阅读(5)  评论(0)    收藏  举报