poj 1201 差分约束

转自:優YoU  http://user.qzone.qq.com/289065406/blog/1307063918

大致题意:

给出数轴上的n个区间[ai,bi],每个区间都是连续的int区间。

现在要在数轴上任意取一堆元素,构成一个元素集合V

要求每个区间[ai,bi]和元素集合V的交集至少有ci不同的元素

求集合V最小的元素个数。

 

解题思路:

设s[x] = 从0 到x 的所有在集合中的数的个数

则ai到bi的个数即S[bi] - S[ai-1]。
因此有

(1) S[bi] - S[ai-1] >= ci。

又根据s[x]本身的性质,后面的一定不比前面的小,后面的最多比前面多一,有:
(2)  s[i + 1] - s[i] >= 0 
(3)  s[i + 1] - s[i] <= 1
故建图,使图中每一组边,均满足(注意三条式子的不等号方向要一致,这个很重要):
S[ai - 1] <= S[bi] - ci 
S[i] <= S[i - 1] + 1 
S[i - 1] <= S[i]

上面三式,可把s[x]看作源点(假设存在)到各点的最短距离,初始化为0;

常数为边(ai – 1,bi)的边权


当存在不满足这三条式子的边时,对这条边进行Relax操作,更新不等号左边的变量

其实就是Bellman-Ford算法的核心部分

if( S[ai - 1] > S[bi] – 2 )   S[ai - 1] = S[bi] – ci ;

if( S[i] > S[i - 1] + 1 )   S[i] > S[i - 1] + 1 ;

if( S[i - 1] > S[i] )   S[i - 1] = S[i] ;

 

最后源点到最大顶点的距离减去源点到最小顶点的距离就是所求(其实一个单位距离就代表V中的一个元素;最小顶点到最大顶点其实就是所有输入的区间中,最小的左端点到最大的右端点这个范围)

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <map>
 7 #include <queue>
 8 #include <stack>
 9 #include <cmath>
10 //#pragma comment(linker, "/STACK:102400000,102400000")
11 using namespace std;
12 #define PF(x) cout << "debug: " << x << " ";
13 #define EL cout << endl;
14 #define PC(x) puts(x);
15 typedef long long ll;
16 #define CLR(x, v) sizeof (x, v, sizeof(x))
17 using namespace std;
18 const int INF = 0x5f5f5f5f;
19 const int  N= 2e5 + 10;
20 const int mod=1e9 + 7;
21 const int maxn = 5e4 + 10;
22 int n,c[maxn],dis[maxn];
23 struct st{
24     int s,e;
25 }val[maxn];
26 int main()
27 {
28   //  freopen("in.txt","r",stdin);
29     while(~scanf("%d",&n)){
30         int sta = INF,to = 0;
31         for(int i = 1;i <= n;i++){
32             scanf("%d%d%d",&val[i].s,&val[i].e,&c[i]);
33             val[i].e++;
34             to = max(to,val[i].e);
35             sta = min(sta,val[i].s);
36         }
37         for(int i = 0;i <= n;i++) dis[i] = 0;
38         bool fg = false;
39         while(!fg){//注意不等式的变换,全部是变小
40             fg = true;
41            // cout<<1<<endl;
42             for(int i = 1;i <= n;i++)
43                 if(dis[val[i].s] > dis[val[i].e] - c[i]){
44                     fg = false;
45                     dis[val[i].s] = dis[val[i].e] - c[i];
46                 }
47             for(int i = sta;i < to;i++)
48                 if(dis[i + 1] > dis[i] + 1){
49                     fg = false;
50                     dis[i + 1] = dis[i] + 1;
51                 }
52             for(int i = to - 1;i >= sta;i--)
53                 if(dis[i] > dis[i + 1]){
54                     fg = false;
55                     dis[i] = dis[i + 1];
56                 }
57 
58         //cout<<dis[to] - dis[sta]<<endl;
59 
60         }
61     cout<<dis[to] - dis[sta]<<endl;
62     }
63     return 0;
64 }

 

转载于:https://www.cnblogs.com/shimu/p/5822078.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle11 删除表空间,oracle11g启动停止服务,修改字符集,导入导出,创建删除表空间,卸载oracle等...

oracle11g启动停止服务,修改字符集,导入导出,创建删除表空间,卸载oracle等1. 【启动停止服务】//启动停止监听 www.2cto.comlsnrctl start;lsnrctl stop;//启动停止服务sqlplus orcl as sysdba; //登录>shutdown immediate;>STARTUP;或者ps -ef|grep ora_dbw0_$O…

Java中包装类型和基本类型的使用场景(阿里开发规范)

基本数据类型和包装数据类型推荐使用场景 所有的 POJO 类属性必须使用包装数据类型RPC 方法的返回值和参数必须使用包装数据类型所有的局部变量推荐使用基本数据类型

数据库:整理四个实用的SQLServer脚本函数

今天给大家分享小编自己日常工作积累的四个SQLServer脚本函数 目录 1、字符串指定字符分割为list 2、数字去掉末尾的0 3、创建表、视图、函数、存储过程判断是否存在 4、金额转换为大写 1、字符串指定字符分割为list 功能&#xff1a;主要适用于数据库字段存储字段用逗号等分隔…

python排名分析_用Python分析了近几年胡润排行榜,我酸了……

10 月 20 日&#xff0c;胡润研究院发布《2020 胡润百富榜》&#xff0c;也就是富富富豪排行榜杭州的马云毫无悬念的再次摘下中国首富桂冠&#xff0c;深圳的马化腾位列第二榜单被我翻烂了&#xff0c;还是没有找到我的名字&#xff0c;难道是被遗漏了吗&#xff1f;&#xff1…

sublime代码片段

创建方法&#xff1a;Tools > New Snippet 这时你会看到如下示例代码&#xff1a; <snippet><content><![CDATA[Hello, ${1:this} is a ${2:snippet}.]]></content><!-- Optional: Set a tabTrigger to define how to trigger the snippet -->…

定义DO/DTO/VO等POJO类时,不要设定任何属性默认值

定义DO/DTO/VO等POJO类时&#xff0c;不要设定任何属性默认值

php事务 面向对象,关于PHP面向对象的事务脚本模式

下面为大家带来一篇PHP面向对象之事务脚本模式(详解)。内容挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。如下所示&#xff1a;/*事务脚本模式: 类似于thinkphp中的model层&#xff0c;或者说就是操作数据库的类。个人觉得实践中使用起来还是挺简单方便…

分布式数据库相关概念介绍

1、分布式数据库的概念分布式数据库系统&#xff08;Distributed Database System&#xff0c;DDBS&#xff09;是针对面向地理上分散&#xff0c;而管理上有需要不同程度集中管理的需求而提出的一种数据库管理信息系统。2、分布式数据库系统组成LDBMS(Local DBMS)&#xff1a;…

社会管理网格化 源码_为什么说网格化管理是基层社会治理的有效武器

在社会治安综合治理中网格化管理是当前各地加强基层社会治理的一种有效“武器”。为什么要说网格化管理是基层社会治理的有效“武器”&#xff1f;这就要为大家讲讲以下几点了&#xff0c;好让大家清楚的明白为什么。网格化管理适应当代社会的基本特性。网格化服务管理是当前城…

【Time系列一】datetime的妙用

今天在弄个自动关机小脚本的时候&#xff0c;遇到了时间转换的问题&#xff0c;也难怪&#xff0c;以前没学过&#xff0c; 不能怪我不会哦! 首先&#xff0c;先学会打印出当前时间的几种方式 参考开源社区: http://my.oschina.net/u/1032854/blog/198179#OSC_h1_3 菜鸟编程:…

循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

循环体内&#xff0c;字符串的连接方式&#xff0c;使用StringBuilder的append方法进行扩展

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换

经常有同学问树结构的相关操作&#xff0c;也写了很多次&#xff0c;在这里总结一下 JS 树形结构一些操作的实现思路&#xff0c;并给出了简洁易懂的代码实现。本文内容结构大概如下&#xff1a;JS树结构相关操作1遍历树结构1. 树结构介绍JS中树结构一般是类似于这样的结构&…

python框架django的使用_Django框架的基本使用,若依框架

Django框架的基本使用&#xff0c;若依框架Django框架的基本使用Django是一个功能强大的web框架框架模式1、MVC和MTV框架MVC&#xff1a;Web服务器开发领域里著名的MVC模式&#xff0c;所谓MVC就是把Web应用分为模型(M)&#xff0c;控制器(C)和视图(V)三层&#xff0c;结构说明…

初学js

今天开始接触js&#xff0c;知道了js的功能以及学习的意义&#xff0c; 今天从命名的规范和数值的规则就能看出js是1门非常严谨的课程&#xff0c;只有做好细节才能体现出js的强大之处&#xff0c; var是定义一个名字 var name1&#xff1b; 定义了还能赋值&#xff0c;可以是数…

数据库:SQLServer中GUID用法介绍

今天给大家分享一下SQLServer中生成GUID的用法。一、NEWID用法NEWID()作用是生成无顺序的GUID字符串。用法如下&#xff1a;SELECT NEWID() --生成36位的GUIDSELECT REPLACE(newid(), -, ) -- 生成32 位的GUID二、NEWSEQUENTIALID用法1、NEWSEQUENTIALID是什么&#xff1f;在指…

oracle po:默认申请分组,PR自动创建PO采购订单:强制按照PR行进行分组

有时候&#xff0c;需要实现强制按照PR行来自动创建PO。举个例子&#xff1a;假设2张PR&#xff0c;同一个物料&#xff0c;同一个需求日期等等的&#xff0c;在合并采购订单的时候&#xff0c;希望是2个PO行。按照标准功能的处理逻辑&#xff0c;如果是同一个物料需求日期(配置…

cserialport 循环发送信号_C++信号处理

免费C语言教程&#xff1a;阿里云大学——开发者课堂(点击文章最下方“了解更多”)信号是由操作系统传给进程的中断&#xff0c;会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上&#xff0c;可以通过按 CtrlC 产生中断。有些信号不能被程序捕获&#xff0c;但…

Javascript第一天

引入的三种方法&#xff1a; 1、将javascript代码插入html文档<head>部分的<script>标签中 例&#xff1a;<head> <script type“text/javascript”> //javascript 代码 alert(‘hello world’); </script> </head> 2、将javascript代码存…

不要在foreach循环里进行元素的remove/add操作。remove元素请使用iteratot方式,如果并发操作,需要对Iterator对象加锁

不要在foreach循环里进行元素的remove/add操作。remove元素请使用iteratot方式&#xff0c;如果并发操作&#xff0c;需要对Iterator对象加锁