【网络流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. Centos 6.7 KVM下安装windows 7系统

    装windows 虚拟机之前你需要做以下准备工作:A.下载windows 镜像文件和 windows 的驱动iso 文件到本地,然后上传至服务器的某个目录(当然你也可以直接在服务器上下载):B.你本地 ...

  2. Trie树 字典树-学习笔记

    字符串--蒟蒻永远的阴影 对于字符串匹配 KMP很好的解决了以一个文本串匹配一个模板串的问题 但如果模板串有多个呢 这是KMP不再适用 我们引入一个新的数据结构--字典树 (当然又有像AC自动机这样更 ...

  3. python并发编程之多进程(三):共享数据&进程池

    一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...

  4. js利用闭包封装自定义模块的几种方法

    1.自定义模块: 具有特定功能的js文件 将所有的数据和功能都封装在一个函数的内部 只向外暴露一个包含有n个方法的对象或者函数 模块使用者只需要通过模块暴露的对象调用方法来实现相对应的功能 1.利用函 ...

  5. Nginx下编译PHP+Mysql

    先说一下PHP在Apache和Nginx下所扮演的角色 apache一般是把php当做自己的一个模块来启动的. 而nginx则是把http请求变量(如get,user_agent等)转发给 php进程 ...

  6. ACdream 1031 Cut

    题意:给定一棵树,删除一些边,让整棵树被分成多个节点数为偶数的联通块,且联通块尽量多. 思路:如果出现连通且节点数为偶数的立即删除这个点与它父节点之间的边,尽量删除即可,因为题目说了保证n为偶数,删了 ...

  7. nyoj913 取石子(十) SG函数 + Nimm博弈

    思路: 第一堆:SG = n % 3; 第二堆:无规律,打表即可,用hash比set快很多; 第三堆:SG = n; 第四堆:无规律 第五堆:SG = n % 2; 第六堆:SG = n % (i + ...

  8. JavaScript网页全屏API

    在大多数的浏览器中都有实现网页全屏显示的功能,并且大部分浏览器实现全屏显示和退出全屏显示的快捷键通常是F11和Esc两个按键.如今,W3C已经制定了关于网页全屏显示的API,利用这个API 可以实现网 ...

  9. 前端时间戳timestamp相关总结:

    一.JavaScript获取当前时间戳的方法 第一种方法:var timestamp = Date.parse(new Date());结果:1280977330000 第二种方法:var times ...

  10. 禁掉coolie,session还能正常使用吗?

    Cookie禁用了,Session还能用吗?   Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案 ...