POJ 1201 差分方程分析
POJ 1201
给你N个闭区间。每个区间分别为[ai,bi],你必须在这个区间上至少取ci个不同的整数。
现要求所有区间满足各自的条件。
问最少需要选多少个点。
例如[3,7](3) [8,10](3) [6,8](1) [1,3](1) [10,11](1)
我们最少需要选6个点:
3 4 6 8 9 10
在这里我们可以看成是dp[7]-dp[2]>=3 dp[10]-dp[8]>=3 ....
这就可以理解为2->7的距离可以定为3,8->10的距离也定为3
我们再看看Si的定义,也不难写出0<=Si - Si-1<=1的限制条件,虽然看上去是没有什么意义的条件,但是如果你也把它构造出一系列的边的话,这样从起点到终点的最短路也就顺理成章的出现了。
我们将上面的限制条件写为同意的形式:
Sbi - Sai >= ci
Si - Si-1 >= 0
Si-1 - Si >= -1
这样子我们相当于在一个构建好的有向图中找一个最长路径,这跟之前的最短路径正好相反,所以需要引起注意
那么dp在初始化时需尽可能小,才能不断更新出最大值
for(int i=first[u];i!=-;i=area[i].next){
if(dp[area[i].y]<dp[u]+area[i].d){
dp[area[i].y]=dp[u]+area[i].d;
if(!visit[area[i].y])
visit[area[i].y]=,q.push(area[i].y);
}
所以这里要引起注意,要在小于的情况下继续执行程序,不断更新出最大值。
对于一个差分问题来说是可能存在无解的情况的,那说明形成的是负圈,但这道题目明显表示有解,所以无需进行负圈的判断。
总代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
#define N 50005
#define M 200000 int visit[N],dp[N],first[N],k,n,m,maxn,minn; struct Area{
int y,next,d;
}area[M]; void init()
{
k=,maxn=,minn=N;
memset(first,-,sizeof(first));
} void add(int a,int b,int c){
area[k].y=b,area[k].d=c,area[k].next=first[a];
first[a]=k;
k++;
} void spfa()
{
memset(visit,,sizeof(visit));
queue<int> q;
memset(dp,-,sizeof(dp));
dp[minn]=,visit[minn]=,q.push(minn);
while(!q.empty()){
int u=q.front();
q.pop();
visit[u]=;
for(int i=first[u];i!=-;i=area[i].next){
if(dp[area[i].y]<dp[u]+area[i].d){
dp[area[i].y]=dp[u]+area[i].d;
if(!visit[area[i].y])
visit[area[i].y]=,q.push(area[i].y);
}
}
}
} int main()
{
int a,b,c;
while(scanf("%d",&n)!=EOF){
init();
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
//add(b,a-1,-c);
add(a,b+,c);
maxn=max(maxn,b+);
minn=min(minn,a);
}
for(int i=minn;i<maxn;i++){
add(i,i+,);
add(i+,i,-);
}
spfa(); printf("%d\n",dp[maxn]);
}
return ;
}
POJ 1201 差分方程分析的更多相关文章
- POJ 1201 && HDU 1384 Intervals(差动制动系统)
职务地址:POJ 1201 HDU 1384 依据题目意思.能够列出不等式例如以下: Sj-Si>=c; Si-S(i-1)>=0; S(i-1)-Si>=-1; 然后用最短路s ...
- poj 1201 Intervals 解题报告
Intervals Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Submit Statu ...
- 【POJ 1201】 Intervals(差分约束系统)
[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS Memory Limit: ...
- POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束
POJ 1201 http://poj.org/problem?id=1201 题目大意: 有一个序列,题目用n个整数组合 [ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai, ...
- 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 都 ...
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals(差分约束+spfa 求最长路径)
题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...
- 【38.24%】【POJ 1201】Intervals
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25902 Accepted: 9905 Description You are ...
- POJ 1201 Intervals【差分约束】
传送门:http://poj.org/problem?id=1201 题意: 有n个如下形式的条件:,表示在区间[, ]内至少要选择个整数点.问你满足以上所有条件,最少需要选多少个点? 思路:第一道差 ...
随机推荐
- CentOS 7.4安装mariadb,启动报错
[root@iZ25b6alxstZ ~]# systemctl start mariadb Job for mariadb.service failed because the control pr ...
- AJPFX总结面向对象(this和super的区别和应用)
面向对象(this和super的区别和应用)(掌握)* A:this和super都代表什么 * this:代表当前对象的引用,谁来调用我,我就代表谁 * super:代表当 ...
- AJPFX总结集合的概念
//java 中集合的概述========================================================== 集合的概念: 为 ...
- js中不容小觑的var声明
在学习vue相关课程中,有一次跟着老师敲代码,写出了如下代码: var Child = { template:`<div @click='handleClick'><slot> ...
- WEB前端学习有用的书籍
WEB前端研发工程师,在国内算是一个朝阳职业,这个领域没有学校的正规教育,大多数人都是靠自己自学成才.本文主要介绍自己从事web开发以来(从大二至今)看过的书籍和自己的成长过程,目的是给想了解Java ...
- android 防止bitmap 内存溢出
在android开发过程中经常会处理网络图片发送内存溢出,那么怎么解决这种问题? 思路: 下载到本地 通过网络获取和文件下载存放到手机中目录 代码: // 获取网络 public InputStrea ...
- qt5.5.1+vs2010发送邮件
最近用到了这个功能,用于验证登陆~为此在网上找了好久,发现这方面的问答并不多!唯独这篇的解答实在.原文传送 1.首先选定自己的发送方的邮箱,无论是163还是qq邮箱等,首先都得开通SMTP服务:以16 ...
- 备忘录:python 3在class中使用yield
之前代码都是直接在函数级别使用yield,但封装class后如何使用yield很少遇到. 经过半天的学习,总算完成示例.代码没有什么特殊地方,仅仅作为一个工作项. 与生成器合作: ########## ...
- java环境变量配置-简易菜鸟版
NO1:Path配置: 用户Path:%JAVA_HOME%\bin 系统Path:%java_home%\bin;%java_home%\jre\bin NO2:CLASSPATH配置: .;%ja ...
- Linux centos7开机界面出现多个选项
centos7开机界面出现多个选项时 前面几个选项正常启动,最后一个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统) 在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内 ...