1751【差分约束】Intervals(区间).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1751【差分约束】Intervals(区间)

【差分约束】Intervals(区间) Time Limit:2000MS? Memory Limit:65536K Total Submit:4 Accepted:4 Description 区间(intervals.pas/c/cpp) 【问题描述】 给定n个封闭的整数区间[ai, bi] i 1,2,...,n 和n个整数c1, ..., cn。 编写一个程序: 计算一个最少点数的点集Z,使得Z在第i个区间中的点的数量至少为ci,i 1,2,...,n。 Input 第一行包括一个整数n 1 n 50000 ,表示区间的数量。 接下来n行每行包括三个整数,ai,bi,ci,其中0 ai bi 50000,1 ci bi - ai+1。 Output 输出一个整数,表示点集Z中点的数量。 Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 Hint 本题数据不完整,请在本系统测试通过后到/problem?id 1201 提交完整测试! Source Southwestern Europe 2002 大致题意: 给出数轴上的n个区间[ai,bi],每个区间都是连续的int区间。 现在要在数轴上任意取一堆元素,构成一个元素集合V 要求每个区间[ai,bi]和元素集合V的交集至少有ci不同的元素 求集合V最小的元素个数。 解题思路: POJ1716的升级版,只是边权不是固定,而是变化的而已 其实只要把POJ1716的 范围 和“固定边权2”改为ci 就能直接AC了 注意本题只能用差分约束+Relax解决,不能像POJ1716那样用贪心。 POJ1716:/座机电话号码6/blog/1座机电话号码6 建议先去把我做1716的方法看懂了,再来做这题,不过我还是重述一下思路: 设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中的一个元素;最小顶点到最大顶点其实就是所有输入的区间中,最小的左端点到最大的右端点这个范围)。 var i,j,n,m,min:longint; a:array[-1..50000,1..3] of longint; d:array[-1..50000] of longint; procedure Bellman_Ford; var i,j:longint; flag:boolean; begin flag: true; fillchar d,sizeof d ,0 ; while flag do begin flag: false; for j: 1 to n do if d[a[j,1]] d[a[j,2]]+a[j,3] then begin d[a[j,1]]: d[a[j,2]]+a[j,3]; flag: true; end; for i: min to m do begin if d[i] d[i-1] then begin d[i-1]: d[i]; flag: true; end; if d[i] d[i-1]+1 then begin d[i]: d[i-1]+1; flag: true; end; end; end; end; begin readln n ; m: 0; min: 座机电话号码; for i: 1 to

文档评论(0)

tiangou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档