题目大意:有 N 个区间,在区间 [a, b] 中至少取任意互不相同的 c 个整数。求在满足 N 个区间约束的情况下,至少要取多少个正整数。

题解:差分约束系统模板题。

差分约束系统是对于 N 个变量的 M 组线性约束,每组约束满足的条件形如 \(X_i\le X_j+c\)。当所有约束条件均得到满足的时候,意味着以上 M 组不等式均成立。这时,类比于图论中的单源最短路模型,即:当对一个有向图求完单源最短路算法之后,对于图中每一个节点均满足 \(d[i]\le d[j]+e(i,j)\)。因此,可以将 \(X_i\) 看作有向图中的节点,权值看作边,求单源最短路的过程结束后,自然保证了所有约束条件的成立(无解的情况除外)。

差分约束系统最重要的是如何构造,构造方法大体有:

  • 将最优解表示为前缀的形式,这样才能利用到区间的差分性质。
  • 考虑最优解前缀的单调性,即:是否隐含着后一项必须大于前一项。
  • 对于本题来说,还需要考虑每个位置的点只能被选择一次。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10; inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
} struct node{
int nxt,to,w;
}e[maxn<<2];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w){
e[++tot]=(node){head[from],to,w},head[from]=tot;
}
int n,bl,br,d[maxn];
queue<int> q;
bool in[maxn]; void read_and_parse(){
n=read(),bl=1e8,br=-1e8;
for(int i=1;i<=n;i++){
int l=read()+1,r=read()+1,c=read();
bl=min(bl,l),br=max(br,r);
add_edge(l-1,r,c);
}
for(int i=bl;i<=br;i++)add_edge(i-1,i,0),add_edge(i,i-1,-1);
} void spfa(){
fill(in+bl,in+br+1,0);
fill(d+bl,d+br+1,-1e9);
d[bl-1]=0,in[bl-1]=1,q.push(bl-1);
while(q.size()){
int u=q.front();q.pop(),in[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(d[v]<d[u]+w){
d[v]=d[u]+w;
if(!in[v])in[v]=1,q.push(v);
}
}
}
} void solve(){
spfa();
printf("%d\n",d[br]);
}
void init(){
memset(head,0,sizeof(head)),tot=1;
} int main(){
int T=read();
while(T--){
init();
read_and_parse();
solve();
}
return 0;
}

【SPOJ116】Intervals的更多相关文章

  1. 【POJ】【3680】Intervals

    网络流/费用流 引用下题解: lyd: 首先把区间端点离散化,设原来的数值i离散化后的标号是c[i].这样离散化之后,整个数轴被分成了一段段小区间. 1.建立S和T,从S到离散化后的第一个点连容量K, ...

  2. 【poj1201】 Intervals

    http://poj.org/problem?id=1201 (题目链接) 题意 给出n个区间${[ai,bi]}$,要求选出尽可能少的数,使得每个区间i中至少存在${c[i]}$个数. Soluti ...

  3. 【POJ1021】Intervals (最短路解差分约束)

    题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...

  4. 【XSY1841】Intervals

    Description 在一个长度为m的序列中选出n个区间,这些区间互不包含,且至少有一个区间的左端点为x. 问有多少种方案,注意交换两个区间的顺序视为不同方案. ​ 答案很大,输出模10000000 ...

  5. 【POJ3680】Intervals(费用流)

    题意:有n条线段,每条有起点,终点和一个权值 要求选取一些线段,使它们的权值和最大,并且使每一个点被覆盖不超过k次 1 ≤ K ≤ N ≤ 200 1 ≤ ai < bi ≤ 100,000, ...

  6. 【题解】Intervals

    题目大意   有\(n\)个区间(\(1 \leq n \leq 200\)),第\(i\)个区间覆盖\((a_{i}, b_{i})\)且有权值\(w_{i}\)(\(1 \leq a_{i} &l ...

  7. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  8. 【POJ 1201 Intervals】

    Time Limit: 2000MSMeamory Limit: 65536K Total Submissions: 27949Accepted: 10764 Description You are ...

  9. 【POJ 1201】 Intervals(差分约束系统)

    [POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: ...

随机推荐

  1. __new__和__init__的区别

    __new__是一个静态方法,而__init__是一个实例方法. __new__方法会返回一个创建的实例,而__init__什么都不返回. 只有在__new__返回一个cls的实例时后面的__init ...

  2. windows环境下的git安装及使用

    昨天晚上,我用了一个半小时整github,为了便于他人能快速的安装使用,也为了回顾一下自己痛苦的过程,特意写下这篇博客.好的,让我们开始吧.... 我的环境:win10,msysgit1.9.4.0 ...

  3. 神经网络-SGD-2

    接上节: 3.梯度(gradient): def numerical_gradient(f,x): h=1e-5 grad=np.zeros_like(x) for index_x in range( ...

  4. WPF中自定义MarkupExtension

    在介绍这一篇文章之前,我们首先来回顾一下WPF中的一些基础的概念,首先当然是XAML了,XAML全称是Extensible Application Markup Language (可扩展应用程序标记 ...

  5. shit iview docs & i-radio bug

    shit iview docs & i-radio bug https://github.com/iview/iview/issues/5627 <i-row> <i-col ...

  6. 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)

    1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...

  7. Serialize a Long as a String

    今天在写接口的时候,用postman测试,返回数据与数据库一一对应,但是给前端返回的结果,除了主键id以外,其他都一样,如下 postman: { "unitPrice": nul ...

  8. Web API 2 添加Models and Controllers Part 2.

    在方案中找到Models文件夹,右键添加类,命名为Author. Author.cs 替换以下代码 C# using System.Collections.Generic; using System. ...

  9. codeforces570C

    Replacement CodeForces - 570C 话说很久很久以前,孙悟空被压在了山下,很无聊.于是他找了一个只包含小写字母和字符"." 的字符串. 由于他比较无聊,他就 ...

  10. hdu-4763(kmp+拓展kmp)

    题意:给你一个串,问你满足最大字串既是前后缀,也在字符串除去前后缀的位置中出现过: 思路:我用的是拓展kmp求的前后缀,只用kmp也能解,在字符串2/3的位置后开始遍历,如果用一个maxx保存前2/3 ...