acwing362

在这里插入图片描述

思路就是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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值