【网络流24题】最长k可重区间集(费用流)

题面

Cogs

Loj

洛谷

题解

首先注意一下

这道题目里面

在Cogs上直接做就行了

洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\(l,r\)

首先离散化

数据范围比较大

记录一下\(l,r\)和区间大小

这个问题可以换一种看法

相当于从源点出发,走K次,

问你路径的最大权值和

其中有些边可以无限制的走,但是它们的长度为0

所以从源点开始到汇点,挂出一条链来

容量为K,费用为0

这些路是可以随便走的

另外,还有若干个区间

但是每个只能走一次

因此,直接把相应的区间连起来,容量为1,费用为长度

这样的话,控制了流最多为K

跑一边最大费用流就是答案啦

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define MAX 5000
  13. #define MAXL 500000
  14. #define INF 1000000000
  15. inline int read()
  16. {
  17. int x=0,t=1;char ch=getchar();
  18. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  19. if(ch=='-')t=-1,ch=getchar();
  20. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  21. return x*t;
  22. }
  23. struct Line
  24. {
  25. int v,next,w,fy;
  26. }e[MAXL];
  27. bool vis[MAX];
  28. int h[MAX],cnt=2;
  29. inline void Add(int u,int v,int w,int fy)
  30. {
  31. e[cnt]=(Line){v,h[u],w,fy};h[u]=cnt++;
  32. e[cnt]=(Line){u,h[v],0,-fy};h[v]=cnt++;
  33. }
  34. int pe[MAX],pr[MAX],dis[MAX];
  35. int S,T,Cost,n,m,Flow,opt=-1;
  36. bool SPFA()
  37. {
  38. memset(dis,63,sizeof(dis));
  39. queue<int> Q;
  40. Q.push(S);dis[S]=0;
  41. while(!Q.empty())
  42. {
  43. int u=Q.front();Q.pop();
  44. for(int i=h[u];i;i=e[i].next)
  45. {
  46. int v=e[i].v;
  47. if(e[i].w&&dis[v]>dis[u]+e[i].fy)
  48. {
  49. dis[v]=dis[u]+e[i].fy;
  50. pe[v]=i;pr[v]=u;
  51. if(!vis[v])vis[v]=true,Q.push(v);
  52. }
  53. }
  54. vis[u]=false;
  55. }
  56. if(dis[T]>=INF)return false;
  57. int flow=INF;
  58. for(int i=T;i!=S;i=pr[i])flow=min(flow,e[pe[i]].w);
  59. for(int i=T;i!=S;i=pr[i])e[pe[i]].w-=flow,e[pe[i]^1].w+=flow;
  60. Cost+=opt*flow*dis[T];
  61. Flow+=flow;
  62. return true;
  63. }
  64. struct I{int l,r,v;}q[MAX];
  65. int Sta[MAX],tot=0,K;
  66. int main()
  67. {
  68. freopen("interv.in","r",stdin);
  69. freopen("interv.out","w",stdout);
  70. n=read();K=read();
  71. for(int i=1;i<=n;++i)
  72. {
  73. q[i].l=read();q[i].r=read();
  74. if(q[i].l>q[i].r)swap(q[i].l,q[i].r);
  75. q[i].v=q[i].r-q[i].l;
  76. Sta[++tot]=q[i].l;Sta[++tot]=q[i].r;
  77. }
  78. sort(&Sta[1],&Sta[tot+1]);
  79. tot=unique(&Sta[1],&Sta[tot+1])-Sta-1;
  80. for(int i=1;i<=n;++i)
  81. {
  82. q[i].l=lower_bound(&Sta[1],&Sta[tot+1],q[i].l)-Sta;
  83. q[i].r=lower_bound(&Sta[1],&Sta[tot+1],q[i].r)-Sta;
  84. }
  85. S=0;T=tot+1;
  86. for(int i=0;i<T;++i)Add(i,i+1,K,0);
  87. for(int i=1;i<=n;++i)Add(q[i].l,q[i].r,1,-q[i].v);
  88. while(SPFA());
  89. printf("%d\n",Cost);
  90. return 0;
  91. }

【网络流24题】最长k可重区间集(费用流)的更多相关文章

  1. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

  2. [网络流24题]最长k可重区间集[题解]

    最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...

  3. [网络流24题] 最长k可重区间集

    https://www.luogu.org/problemnew/show/3358 以区间(1,5),(2,6),(7,8)为例 建模方法一: 建模方法二: 离散化区间端点 相当于找k条费用最大的不 ...

  4. [网络流24题] 最长K可重区间集问题

    题目链接:戳我 当时刷24题的时候偷了懒,没有写完,结果落下这道题没有写qwq结果今天考试T3中就有一部分要用到这个思想,蒟蒻我硬是没有想到网络流呜呜呜 最大费用流. 就是我们考虑将问题转化一下,转化 ...

  5. [网络流24题] 最长k可重区间集问题 (费用流)

    洛谷传送门 LOJ传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...

  6. [网络流24题]最长k可重线段集[题解]

    最长 \(k\) 可重线段集 题目大意 给定平面 \(x-O-y\) 上 \(n\) 个开线段组成的集合 \(I\) ,和一个正整数 \(k\) .试设计一个算法,从开线段集合 \(I\) 中选取开线 ...

  7. [网络流24题] 最长k可重线段集问题 (费用流)

    洛谷传送门 LOJ传送门 最长k可重区间集问题的加强版 大体思路都一样的,不再赘述,但有一些细节需要注意 首先,坐标有负数,而且需要开$longlong$算距离 但下面才是重点: 我们把问题放到了二维 ...

  8. 网络流24题-最长k可重线段集问题

    最长k可重线段集问题 时空限制1000ms / 128MB 题目描述 给定平面 x−O−y 上 n 个开线段组成的集合 I,和一个正整数 k .试设计一个算法,从开线段集合 I 中选取出开线段集合 S ...

  9. LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集

    #6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   ...

随机推荐

  1. 把页面的Table直接输出到Excel文件中

    有个需求是统计的时候,为生成的html表格提供导出功能,但是这样导出Excel不会显示自身的表格 影响美观,但是excel会显示html的css样式,这里可以通过处理行对象的方式进行导出,但是处理起纵 ...

  2. JQuery 验证框架

      设计完美,可扩展性好,以后就用他了. http://docs.jquery.com/Plugins/Validation /**//** * @author ming */ $(document) ...

  3. PHP 批量获取指定目录下的文件列表(递归,穿透所有子目录)

    //调用 $dir = '/Users/xxx/www'; $exceptFolders = array('view','test'); $exceptFiles = array('BaseContr ...

  4. 使用matlab生成sine波mif文件

    使用matlab生成sine波mif文件 作者:lee神 在使用altera 的FPGA中的rom过程中常常会使用到.mif文件或.hex文件.对于初学者,无论mif还是hex都是很令人疑惑的东西,这 ...

  5. 基于agenda的Nodejs定时任务管理框架搭建

    0.背景 在大型项目中,定时任务的应用场景越来越广.一般来说,按照微服务的思想,我们会将定时任务单独部署一套服务,核心的业务接口独立到另一个服务中,从而降低相互之间的耦合程度.在需要使用定时任务时,只 ...

  6. Yii2-admin的详细使用教程

    Yii2-admin的详细使用教程 参考:http://www.yiichina.com/tutorial/571    http://www.kancloud.cn/curder/yii/24775 ...

  7. SpringBoot实战 之 异常处理篇

    在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然 ...

  8. OpenStack Ironic 常见问题

    whole disk和partition 镜像 whole disk镜像部署可以支持windows,但是不能自定义分区(可以通过cloud-init实现),分区表是做镜像的人确定好的,partitio ...

  9. pc浏览器css和js计算浏览器宽度的差异以及和滚动条的关系

    如图: css宽度:1250 不包括滚动条宽度 用控制台箭头选取元素显示的左边的宽度:1250  不包含滚动条宽度 缩放浏览器右上角显示的宽度:1267 包含了滚动条宽度 再看下控制台: 由此可计算浏 ...

  10. 最新的Android版本和API Level的对应关系表

    在项目开发过程中,经常会用到API Level和Android平台版本的对照,来进行一些方法的调用,现在就把对照表贴出来,供开发人员参考,并且方便自己查阅. Platform Version API ...