给定区间集合$I$和正整数$k$, 计算$I$的最长$k$可重区间集的长度.

区间离散化到$[1,2n]$, $S$与$1$连边$(k,0)$, $i$与$i+1$连边$(k,0)$, $2n$与$T$连边$(k,0)$. 对于每个区间$(l,r)$, $l$与$r$连边$(1,l-r)$.

最小费用相反数就为最大长度

  1. #include <iostream>
  2. #include <sstream>
  3. #include <algorithm>
  4. #include <cstdio>
  5. #include <math.h>
  6. #include <set>
  7. #include <map>
  8. #include <queue>
  9. #include <string>
  10. #include <string.h>
  11. #include <bitset>
  12. #include <unordered_map>
  13. #define REP(i,a,n) for(int i=a;i<=n;++i)
  14. #define PER(i,a,n) for(int i=n;i>=a;--i)
  15. #define hr putchar(10)
  16. #define pb push_back
  17. #define lc (o<<1)
  18. #define rc (lc|1)
  19. #define mid ((l+r)>>1)
  20. #define ls lc,l,mid
  21. #define rs rc,mid+1,r
  22. #define x first
  23. #define y second
  24. #define io std::ios::sync_with_stdio(false)
  25. #define endl '\n'
  26. #define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
  27. using namespace std;
  28. typedef long long ll;
  29. typedef pair<int,int> pii;
  30. const int P = 1e9+7, P2 = 998244353, INF = 0x3f3f3f3f;
  31. ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
  32. ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
  33. ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
  34. inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
  35. //head
  36.  
  37. #ifdef ONLINE_JUDGE
  38. const int N = 1e6+10;
  39. #else
  40. const int N = 999;
  41. #endif
  42.  
  43. int n, m, k, S, T;
  44. struct _ {int from,to,w,f;};
  45. vector<_> E;
  46. vector<int> g[N];
  47. int a[N], pre[N], inq[N], d[N];
  48. int mf,mc;
  49. queue<int> q;
  50. void add(int x, int y, int c, int w) {
  51. g[x].pb(E.size());
  52. E.pb({x,y,c,w});
  53. g[y].pb(E.size());
  54. E.pb({y,x,0,-w});
  55. }
  56. void mfmc() {
  57. mf=mc=0;
  58. while (1) {
  59. REP(i,1,T) a[i]=d[i]=INF,inq[i]=0;
  60. q.push(S),d[S]=0;
  61. while (!q.empty()) {
  62. int x=q.front(); q.pop();
  63. inq[x] = 0;
  64. for (auto t:g[x]) {
  65. auto e=E[t];
  66. if (e.w>0&&d[e.to]>d[x]+e.f) {
  67. d[e.to]=d[x]+e.f;
  68. pre[e.to]=t;
  69. a[e.to]=min(a[x],e.w);
  70. if (!inq[e.to]) {
  71. inq[e.to]=1;
  72. q.push(e.to);
  73. }
  74. }
  75. }
  76. }
  77. if (a[T]==INF) break;
  78. for (int u=T;u!=S;u=E[pre[u]].from) {
  79. E[pre[u]].w-=a[T];
  80. E[pre[u]^1].w+=a[T];
  81. }
  82. mf+=a[T],mc+=a[T]*d[T];
  83. }
  84. }
  85.  
  86. int b[N], l[N], r[N];
  87. int main() {
  88. scanf("%d%d", &n, &k);
  89. REP(i,1,n) {
  90. scanf("%d%d",l+i,r+i);
  91. b[++*b]=l[i],b[++*b]=r[i];
  92. }
  93. sort(b+1,b+1+*b),*b=unique(b+1,b+1+*b)-b-1;
  94. REP(i,1,n) {
  95. l[i]=lower_bound(b+1,b+1+*b,l[i])-b;
  96. r[i]=lower_bound(b+1,b+1+*b,r[i])-b;
  97. }
  98. S = *b+1, T = S+1;
  99. add(S,1,k,0),add(*b,T,k,0);
  100. REP(i,2,*b) add(i-1,i,k,0);
  101. REP(i,1,n) add(l[i],r[i],1,-b[r[i]]+b[l[i]]);
  102. mfmc();
  103. printf("%d\n", -mc);
  104. }

「网络流 24 题」最长 k 可重区间集的更多相关文章

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

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

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

    #6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...

  3. 【刷题】LOJ 6014 「网络流 24 题」最长 k 可重区间集

    题目描述 给定实直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取出开区间集合 \(S \subseteq ...

  4. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  5. *LOJ#6227. 「网络流 24 题」最长k可重线段集问题

    $n \leq 500$条平面上的线段,问一种挑选方法,使得不存在直线$x=p$与挑选的直线有超过$k$个交点,且选得的直线总长度最长. 横坐标每个点开一个点,一条线段就把对应横坐标连一条容量一费用( ...

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

    [网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...

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

    [网络流24题]最长k可重区间集问题 [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a>< ...

  8. 网络流24题:最长 k 可重区间集问题题解

    最长 k 可重区间集问题题解: 突然想起这个锅还没补,于是来把这里补一下qwq. 1.题意简述: 有\(n\)个开区间,这\(n\)个开区间组成了一个直线\(L\),要求选择一些区间,使得在直线\(L ...

  9. 【PowerOJ1756&网络流24题】最长k可重区间集问题(费用流)

    题意: 思路: [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a><i.b>,建立 ...

随机推荐

  1. CF1208C

    CF1208C 这场杜老师大战tourist的比赛怎么这么多人类智慧题... 题意: 构造一个 $ n \times n $ 的矩阵,使得该矩阵每一行与每一列的元素的异或和全部相等. 解法: 异或的神 ...

  2. mysql服务器变量、缓存及索引

    服务器变量 注意:其中有些参数支持运行时修改,会立即生效:有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效:有些参数作用域是全局的,且不可改变:有些可以为每个用户提供单独(会话)的设置. ...

  3. PostgreSQL判断一个表是否存在

    postgresql判断一个表是否存在: 方法一: select count(*) from pg_class where relname = 'tablename'; 方法二: select cou ...

  4. SQL-W3School-高级:SQL AUTO INCREMENT 字段

    ylbtech-SQL-W3School-高级:SQL AUTO INCREMENT 字段 1.返回顶部 1. Auto-increment 会在新记录插入表中时生成一个唯一的数字. AUTO INC ...

  5. django 2.2和mysql使用的常见问题

    可能是由于Django使用的MySQLdb库对Python3不支持,我们用采用了PyMySQL库来代替,导致出现各种坑,特别是执行以下2条命令的是时候: python manage.py makemi ...

  6. Java Web之过滤器(Filter)

    转: Java Web之过滤器(Filter) 2018年07月31日 16:58:40 喻志强 阅读数 13705更多 所属专栏: Java Web入门   版权声明:本文为博主原创文章, 转载请注 ...

  7. C++ transform for_each

    #include<iostream>#include<vector>#include <list>#include <algorithm>#includ ...

  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_18-异常处理-不可预知异常处理

    框架抛出来的或者一些第三方的组件抛出来的异常.我们根本不知道它所对应的错误代码的信息,所以我们也没有办法给用户返回具体的错误代码和错误信息. 我们先在Map中定义有一些不可预知的异常,定义错误代码和错 ...

  9. Node.js使用superagent模拟GET/POST请求样例

    示例代码: var superagent = require('superagent'); superagent.get("http://localhost:8091/user/all?re ...

  10. 免费好用的 Apple 工具(Windows 适用)

    首先,下载链接: https://pan.baidu.com/s/1Sfx3SB8Ya1aMS01aXk--rA 密码: 6y69 1. Airplay (itools) : ios 可以投屏到win ...