2019暑假集训 Intervals
接下来n行每行描述一个区间,三个整数分别表示ai,bi和ci。( 0 <= ai <= bi <= 50000 并且 1 <= ci <= bi - ai+1.)
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1
6
由题意我们可以知道
b[i]-a[i]+1>=c[i]
两边同时除以-1,
a[i]-1-b[i]<=-c[i]
a[i]<=(b[i]+1)+(-c[i])
这个式子很熟悉有没有?
如果没有,看这个
d[i]<=d[j]+edge(j,i)
记得这个吗?对于一个无法松弛的单源最短路图,必满足上述关系
所以我们在最短路中把(j,i)连边 在本题中将(b[i]+1,a[i])连边 该过程称为差分约束
用d[i]表示从0-i区间中需要选的数
但是应当注意的是 明显d[0]不一定=0 所以我们需要一个虚拟点作为原点
怎样找这个虚拟点?因为前面有一个(b[i]+1),当b[i]=max(b[i])时该值最大 所以最短路应当以max(b[i])为原点进行
由题意,在i至i+1区间中,最多选1个数,最少选0个数
于是得到0<=d[i+1]-d[i]<=1 所以同理我们将(i,i-1,0,)以及(i-1,i,1)连边
最后算出d[max(b[i])]即可
上代码
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,head[],num,a[],b[],c[],d[],vst[];
struct edge
{
int u,v,c,nxt;
}e[];
void add(int u,int v,int c)
{
e[++num].u=u,e[num].v=v,e[num].c=c;
e[num].nxt=head[u],head[u]=num;
}
void spfa(int x)
{
queue<int> q;
memset(d,,sizeof d);
q.push(x);
d[x]=;
vst[x]=;
while(!q.empty())
{
int xx=q.front();
q.pop();
vst[xx]=;
for(int st=head[xx];st!=-;st=e[st].nxt)
{
if(d[e[st].v]>e[st].c+d[xx])
{
d[e[st].v]=e[st].c+d[xx];
if(!vst[e[st].v])q.push(e[st].v),vst[e[st].v]=;
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
memset(head,-,sizeof head);
scanf("%d",&n);
int m=-0x3f3f3f3f;
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
add(b[i]+,a[i],-c[i]);
m=max(m,b[i]+);
}
for(int i=;i<=m;i++)
{
add(i,i-,);
add(i-,i,);
}
// for(int i=1;i<=m;i++)
// add(50005,i,0);
// for(int i=1;i<=num;i++)
// printf("%d %d\n",e[i].u,e[i].v);
spfa(m);
int minn=0x3f3f3f3f;
//for(int i=1;i<=m;i++)minn=min(minn,d[i]);
printf("%d",-d[]/*-minn*/);
return ;
}
2019暑假集训 Intervals的更多相关文章
- 2019暑假集训 BLO
题目描述 Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. 输入 输入n<=100000 ...
- 2019暑假集训 windy数
题目描述 Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为2的正整数被称为 Windy 数. Windy 想知道,在A和B之间,包括A和B,总共有多少个 Windy 数? 输 ...
- 2015UESTC 暑假集训总结
day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- 暑假集训Day2 互不侵犯(状压dp)
这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...
- 暑假集训Day1 整数划分
题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...
- 2013ACM暑假集训总结-致将走上大三征途的我
回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...
- [补档]暑假集训D5总结
%dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ ...
- [补档]暑假集训D1总结
归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...
随机推荐
- 不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)
此文章的主旨是希望过于专注.NET程序员在做好工作.写好.NET程序的同时,能分拨出一点时间接触一下.NET之外的东西(例如10%-20%的时间),而不是鼓动大家什么都去学最后什么都学不精,更不是说. ...
- 获取UWP配置文件中的版本信息
原文:获取UWP配置文件中的版本信息 在一般的软件中,我们都会显示当前软件的版本信息.以前作者都是在发版的时候修改一下UWP的配置文件中的版本信息和软件中的版本信息.但是每次这样很麻烦,有时间忘记修改 ...
- 转换GMT秒数为日期时间格式-Delphi源码
转换GMT秒数为日期时间格式-Delphi源码.收藏最近在写PE分析工具的时候,需要转换TimeDateStamp字段值为日期时间格式,这是Delphi的源码. //把GMT时间的秒数转换成日期时间格 ...
- 学会了使用qmake -query
D:\Qt\Qt5.6.2_static_kk\bin>qmake -queryQT_SYSROOT:QT_INSTALL_PREFIX:C:/Qt/Qt5.6.2_static_kkQT_IN ...
- Codility---PermCheck
Task description A non-empty zero-indexed array A consisting of N integers is given. A permutation i ...
- Python连载8-datetime包函数介绍
一.datetime包(上接连载7内容) 1.函数:datetime (1)用法:输入一个日期,来返回一个datetime类 (2)格式:datetime.datetime(年,月,日,hour=, ...
- java的equals与==的区别
看了网上关于equal与==的区别,感觉很多有些片面,不仔细,这里我来说说我对equal与==的理解 首先要了解基本类型与引用类型 1.int,char,boolean之类的就是基本类型,我们只要使用 ...
- Spark学习之路(九)—— Spark SQL 之 Structured API
一.创建DataFrame和Dataset 1.1 创建DataFrame Spark中所有功能的入口点是SparkSession,可以使用SparkSession.builder()创建.创建后应用 ...
- 【JDK8】HashMap集合 源码阅读
JDK8的HashMap数据结构上复杂了很多,因此读取效率得以大大提升,关于源码中红黑树的增删改查,博主没有细读,会在下一篇博文中使用Java实现红黑树的增删改查. 下面是类的结构图: 代码(摘抄自J ...
- 【JVM】01虚拟机内存模型
学习链接:https://blog.csdn.net/u010425776/article/details/51170118 博主整理的条理清晰,在这里先感谢博主分享 去年看视频学习写过一篇JVM的博 ...