题意翻译

区间取数

题目描述

有n个区间,在区间[ai,bi]中至少取任意互不相同的ci个整数。求在满足n个区间的情况下,至少要取多少个正整数。

输入输出格式

输入格式

多组数据。

第一行的一个整数T表示数据个数。对于每组数据,第一行包含一个整数n(1<=n<=50000)表示区间数。以下n行描述区间。输入的第(i+1)行包含三个整数ai,bi,ci,由空格分开。其中0<=ai<=bi<=50000,1<=ci<=bi-ai+1。

输出格式

对于每组数据,输出一个对于n个区间[ai,bi] 至少取ci个不同整数的数的总个数。

输入输出样例

输入样例#1:

1
5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1

输出样例#1:

6

解析:
这是一道差分约束的模板题,写完这一题之后可以更好地理解差分约束。 【差分约束系统】
差分约束系统是一种特殊的N元一次不等式组。它包含N个变量X1~XN以及M个约束条件,每个约束条件都是由两个变量作差构成的,形如Xi-Xj<=ck,其中ck是常数。我们要解决的问题是:求X的一组解,使得所有约束条件得到满足。 实际上,最短路径问题和最长路径问题都是某种程度上的差分约束系统,对于差分约束系统中的每个条件Xi-Xj>=ck我们可以变形为Xi<=Xj+ck。而单源最短/长路实际上是求了一个差分约束系统的最优解(最小/大的符合条件的情况)。
也就是说,对于一个无向图,我们得到的所有可达点之间的每一条简单路径,都是这个“路径”的差分约束系统的一组解(这个系统几乎没有约束条件)。如果我们要求某一个差分约束系统的最优解,就相当于在一张图上求解最短/长路。 为了便于理解,我们可以将求解最短/长路径的方法看做是求解差分约束的一种工具,将差分约束系统的条件变形作三角形不等式进行求解。 我们看回这道题目,我们会发现题意与差分约束系统十分相似。
假设s[k]为0~k之间最少取到的互不相同(隐藏条件)的整数,根据题意,我们容易得到s[bi]-s[ai-1]>=ci。
特别的,差分约束系统的题目总是有一些隐藏条件,这些条件我们也必须加入到差分约束系统中去,使得这些条件也成立。
本题中,隐藏条件有:
  1. 对于任意一个数,要不然选一次,要不然不选, 不能选两次。于是得到:s[k]-s[k-1]<=1
  2. 对于任意一个区间0~k-1,必然存在一个区间0~k选出的数要不然比0~k-1多,要不然选出的数一样多。于是得到:s[k]-s[k-1]>=0。

但是我们尴尬的发现他们不等号的方向不一致,没事,我们转化一下就好了。

条件1可以变为s[k-1]-s[k]>=-1。

注意一个问题:

如果Xi-Xj的约束条件是<=号,则我们要求的是最短路;

如果约束条件是>=号,则我们要求的是最长路(根据三角形不等式得出)。


首先,我们把0~k(此处的k为最大的那个bi)按照隐藏约束条件初始化,也就是,从每个k-1连一条长0的有向边至k,从每个k连一条长-1的边至k-1。

然后按照输入,依次加入ai-1 -> bi的长度为ci的有向边。

值得注意的是,这里数组下标不能为负数,那我们就给他加成正的,以0为初始阶段点开始,求最长路。

最优解便是d[k]了。

参考代码:(话说这道题快读会爆?!)

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define N 100010
using namespace std;
queue<int> q;
struct node{
int next,ver,edge;
}g[N<<];
int head[N],tot,d[N],n;
bool v[N<<];
void add(int x,int y,int val)
{
g[++tot].ver=y,g[tot].edge=val;
g[tot].next=head[x],head[x]=tot;
}
void spfa(int x)
{
memset(d,-,sizeof(d));
memset(v,,sizeof(v));
d[x]=;v[x]=;
q.push(x);
while(q.size())
{
int index=q.front();q.pop();
v[index]=;
for(int i=head[index];i;i=g[i].next){
int y=g[i].ver,z=g[i].edge;
if(d[y]<d[index]+z){
d[y]=d[index]+z;
if(!v[y]) v[y]=,q.push(y);
}
}
}
}
int main()
{
int t;
cin>>t;
for(int k=;k<=t;k++)
{
tot=;
memset(g,,sizeof(g));
memset(head,,sizeof(head));
int cnt=-N;
scanf("%d",&n); for(int i=;i<=n;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
add(x,y+,c);
cnt=max(cnt,y);
}
for(int i=;i<=cnt+;i++){
add(i-,i,),add(i,i-,-);
}
spfa();
if(k<t) printf("%d\n",d[cnt+]);
else printf("%d",d[cnt+]);
}
return ;
}

SP116 INTERVAL - Intervals的更多相关文章

  1. 60. Insert Interval && Merge Intervals

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  2. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  3. Insert Interval & Merge Intervals

    Insert Intervals Given a non-overlapping interval list which is sorted by start point. Insert a new ...

  4. 56. Merge Intervals 57. Insert Interval *HARD*

    1. Merge Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[ ...

  5. 合并区间 · Merge Intervals & 插入区间 · Insert Interval

    [抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...

  6. [LeetCode] Merge Interval系列,题:Insert Interval,Merge Intervals

    Interval的合并时比较常见的一类题目,网上的Amazon面经上也有面试这道题的记录.这里以LeetCode上的例题做练习. Merge Intervals Given a collection ...

  7. leetcode 56. Merge Intervals 、57. Insert Interval

    56. Merge Intervals是一个无序的,需要将整体合并:57. Insert Interval是一个本身有序的且已经合并好的,需要将新的插入进这个已经合并好的然后合并成新的. 56. Me ...

  8. [LeetCode] Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  9. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

随机推荐

  1. easyui-numberspinner实现双箭头效果

    效果图: 实现了 [点击左上角 输入框的值加 0.5] [ 左下角 值减0.5 ] [ 右上角点击 值加1] [ 右下角点击 值减1] 代码: <span style="positio ...

  2. Django与JS交互的示例代码-django js 获取 python 字典-Django 前后台的数据传递

    Django与JS交互的示例代码 Django 前后台的数据传递 https://www.cnblogs.com/xibuhaohao/p/10192052.html 应用一:有时候我们想把一个 li ...

  3. K8S从入门到放弃系列-(4)kubernetes集群之kubectl命令行工具部署

    摘要:随着版本的不断迭代,k8s为了集群安全,集群中趋向采用TLS+RBAC的安全配置方式,所以我们在部署过程中,所有组件都需要证书,并启用RBAC认证. 我们这里采用二进制安装,下载解压后,把对应组 ...

  4. C++基础--函数重载

    函数重载定义: 在相同的作用域中具有相同的函数名而函数形参列表(参数类型.参数个数.参数顺序)不同的两个函数,称之为函数重载.注意:函数返回值类型并不是重载的条件. 函数重载优点: 可以使用相同的函数 ...

  5. Windows10下安装numpy

    1.https://bootstrap.pypa.io/get-pip.py 下载get-pip.py(右键另存为即可) 2.命令行下在get-pip.py所在文件夹下运行get-pip.py 3.命 ...

  6. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  7. 去除element-ui table表格右侧滚动条的高度

    /* //element-ui table的去除右侧滚动条的样式 */ ::-webkit-scrollbar { width: 1px; height: 1px; } /* // 滚动条的滑块 */ ...

  8. web&http协议&django初识

    1.什么是web应用 ​ Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件. ​ 应用程序有两种模式C/S.B/S ...

  9. Jenkins 2017年用过

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: 1.持续的软件版本 ...

  10. 在.netcore webapi项目中使用后台任务工具Hangfire

    安装Hangfire 在webapi项目中通过nuget安装Hangfire.Core,Hangfire.SqlServer,Hangfire.AspNetCore,截止到目前的最新版本是1.7.6. ...