POJ 1201 Intervals (经典) (差分约束)
<题目链接>
题目大意:
给你$n$段区间,$a_i,b_i,c_i$ 表示在 $[a_i,b_i]$ 区间内至少要选择$c_i$个点。现在问你在满足这n个条件的情况下,最少要选多少个点?
解题分析:
经典的差分约束。本问题需要满足的不等式有:$s[b[i]]-s[a[i]-1]\geq c[i],0\leq s[i]-s[i-1]\leq 1$,其中s[i]表示到第i个位置为止,所选择的点的个数。
转换一下,就能够得到:
$s[b[i]]\geq s[a[i]-1]+c[i]$
$s[i]\geq s[i-1]+0$
$s[i-1]\geq s[i]+(-1)$ 以上转载于 >>>
差分约束不等式与最短(长)路结合的评价标准就是:如果不等式的约束条件是"<=",比如b-a<=n,就是将其在图中转化为add(a,b,n),然后跑最短路,因为那个式子能够转化为 b<=a+n ,这与最短路松弛操作中的三角形不等式 (dis[v]<=dis[u]+w,最终目地的三角形不等式)类似,这里的b就相当于v,a相当于u,所以是a--->b连边。
同理,如果是b-a>=n,就是a--->b连边,然后跑最长路,需要注意的是,由于边权在差分约束中很有可能出现负数,所以一般用SPFA求解最短(长)路。
比如本题就是用SPFA求最长路。
#include <bits/stdc++.h>
using namespace std; const int N=5e4+;
int n,st,ed,cnt;
int head[N],dis[N];
bool vis[N];
struct Edge{
int to,val,nxt;
Edge(int _to=,int _val=,int _nxt=):to(_to),val(_val),nxt(_nxt){}
}edge[N<<];
queue<int>q;
inline void add(int u,int v,int w) {
edge[++cnt]=Edge(v,w,head[u]);
head[u]=cnt;
}
void spfa(){ //利用spfa求最长路
memset(dis,-0x3f,sizeof(dis));
q.push(st);
vis[st]=true;dis[st]=;
while(q.size()){
int u=q.front();q.pop();
vis[u]=false;
for(int i=head[u];~i;i=edge[i].nxt){
int v=edge[i].to;
if(dis[v]<dis[u]+edge[i].val){
dis[v]=dis[u]+edge[i].val;
if(!vis[v])q.push(v),vis[v]=true;
}
}
}
}
int main(){
scanf("%d",&n);
memset(head,-,sizeof(head));
st=1e9,ed=-;
for(int i=;i<=n;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
add(a-,b,c); //s[b]-s[a-1]>=c
st=min(st,a-);ed=max(ed,b);
}
for(int i=st;i<=ed;i++){ //根据添加的两个约束条件建边
add(i-,i,); //s[i]-s[i-1]>=0
add(i,i-,-); //s[i]-s[i-1]<=1 即 s[i-1]-s[i]>=-1
}
spfa(); //因为是">=",与最长路的松弛方式(三角形不等式)相同
printf("%d\n",dis[ed]);
}
POJ 1201 Intervals (经典) (差分约束)的更多相关文章
- POJ 1201 Intervals【差分约束】
传送门:http://poj.org/problem?id=1201 题意: 有n个如下形式的条件:,表示在区间[, ]内至少要选择个整数点.问你满足以上所有条件,最少需要选多少个点? 思路:第一道差 ...
- poj 1201 Intervals(差分约束)
做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...
- 【题解】 POJ 1201 Intervals(差分约束)
懒得复制,戳我戳我 Solution: 这道题就是一个板子题 抽象成第\(a\)至第\(b\)间选择数的个数为\(c\),我们就可以用前缀和来表示,这样就可以得到不等式\(s[b]-s[a-1]> ...
- POJ 1201 Intervals(差分约束 区间约束模版)
关于差分约束详情可阅读:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 题意: 给定n个区间[L,R], 每个区间至 ...
- poj 1201 Intervals【差分约束+spfa】
设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...
- POJ 1201 Intervals (差分约束,最短路)
题意: 有一个集合Z,其元素都是整整数,但是数量未知.现有n个约束,形如 [a,b]=c 表示整数区间[a,b]中有c个元素在Z中出现.问集合Z最小可能含多少个元素? 思路: 对于所给的区间 cnt[ ...
- POJ 3159 Candies(差分约束+spfa+链式前向星)
题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A ...
- poj 1201 Intervals(差分约束)
题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...
- poj 1201 Intervals——差分约束裸题
题目:http://poj.org/problem?id=1201 差分约束裸套路:前缀和 本题可以不把源点向每个点连一条0的边,可以直接把0点作为源点.这样会快许多! 可能是因为 i-1 向 i 都 ...
随机推荐
- re 模块 分组特别说明
关于分组优先以及 " | " 的细致练习 from django.test import TestCase import re # Create your tests here. ...
- BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)
题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...
- Java 找出四位数的所有吸血鬼数字 基础代码实例
/** * 找出四位数的所有吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. * 以两个 ...
- linux18.04+jdk11.0.2+hadoop3.1.2部署伪分布式
1. 下载 安装hadoop3.1.2http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz 注意 ...
- WinForm文件说明
以上位置,双击即可. 界面可以通过拖动控件,也可以通过背后的界面代码去布局. 如果删除了事件代码,界面可能报错,因为界面代码中有未删除的残余(波浪线提示处代码,直接删除即可). 对于多个窗体,Prog ...
- linux线程(一)
线程的优先级无法保障线程的执行次序.只不过优先级高的线程获取 CPU 资源的概率大一点而已. 线程相关函数(1)-pthread_create(), pthread_join(), pthread_e ...
- C# 执行DOS命令和批处理
在项目开发中,有时候要处理一些文件,比如视频格式的转换,如果用C开发一套算法,再用C#调用,未免得不偿失!有时候调用现有的程序反而更加方便.今天就来说一下C#中如何调用外部程序,执行一些特殊任务. 这 ...
- ZooKeeper-API CURD
ZooKeeper Java API pom.xml 依赖 <?xml version="1.0" encoding="UTF-8"?> <p ...
- django中的反向解析
1,定义: 随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超 ...
- 通过go-ethereum源码看如何管理项目
今天抽空看了下go-ethereum项目的源码 ( https://github.com/ethereum/go-ethereum ),其中 ethereum 是github下的一个帐号.go-eth ...