题目描述

对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度。

输入输出格式

输入格式:

的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重迭数。接下来的 n行,每行有 2 个整数,表示开区间的左右端点坐标。

输出格式:

将计算出的最长 k可重区间集的长度输出

输入输出样例

输入样例#1: 复制

  1. 4 2
  2. 1 7
  3. 6 8
  4. 7 10
  5. 9 13
输出样例#1: 复制

  1. 15

说明

对于100%的数据,1\le n\le 5001≤n≤500 ,1\le k\le 31≤k≤3

 
 
确实比较难想
正解有两种
借鉴一下学长的图
 
首先离散化
第一种

这样首先保证每个点都不会覆盖超过$k$次

那么对于一个区间后面的区间,它对这个区间内的点是没有影响的,故建一条如图所示的边

第二种

当选择了一个区间$(l,r)$后,相当于$(l,r)$这个区间内的点少了一次可以被选择的机会

所以从$l$向$r$连边

代码为第2种

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. #include<vector>
  6. #define AddEdge(x,y,z,f) add_edge(x,y,z,f),add_edge(y,x,-z,0)
  7. using namespace std;
  8. const int MAXN=1e5+;
  9. const int INF=1e6+;
  10. inline int read()
  11. {
  12. char c=getchar();int x=,f=;
  13. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  14. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  15. return x*f;
  16. }
  17. int N,K,S,T;
  18. int anscost=;
  19. struct node
  20. {
  21. int u,v,w,f,nxt;
  22. }edge[MAXN];
  23. int head[MAXN],num=;
  24. inline void add_edge(int x,int y,int z,int f)
  25. {
  26. edge[num].u=x;
  27. edge[num].v=y;
  28. edge[num].w=z;
  29. edge[num].f=f;
  30. edge[num].nxt=head[x];
  31. head[x]=num++;
  32. }
  33. int Pre[MAXN],vis[MAXN],dis[MAXN];
  34. bool SPFA()
  35. {
  36. queue<int>q;
  37. memset(dis,0xf,sizeof(dis));
  38. memset(vis,,sizeof(vis));
  39. dis[S]=;
  40. q.push(S);
  41. while(q.size()!=)
  42. {
  43. int p=q.front();q.pop();
  44. vis[p]=;
  45. for(int i=head[p];i!=-;i=edge[i].nxt)
  46. {
  47. if(dis[edge[i].v]>dis[p]+edge[i].w&&edge[i].f)
  48. {
  49. dis[edge[i].v]=dis[p]+edge[i].w;
  50. Pre[edge[i].v]=i;
  51. if(!vis[edge[i].v])
  52. vis[edge[i].v]=,q.push(edge[i].v);
  53. }
  54. }
  55. }
  56. return dis[T]<=INF;
  57. }
  58. void f()
  59. {
  60. int nowflow=INF;
  61. for(int now=T;now!=S;now=edge[Pre[now]].u)
  62. nowflow=min(nowflow,edge[Pre[now]].f);
  63. for(int now=T;now!=S;now=edge[Pre[now]].u)
  64. edge[Pre[now]].f-=nowflow,
  65. edge[Pre[now]^].f+=nowflow;
  66. anscost+=nowflow*dis[T];
  67. }
  68. void MCMF()
  69. {
  70. int ans=;
  71. while(SPFA())
  72. f();
  73. printf("%d\n",-anscost);
  74. }
  75. int L[MAXN],R[MAXN],date[MAXN],tot=;
  76. int main()
  77. {
  78. #ifdef WIN32
  79. freopen("a.in","r",stdin);
  80. #else
  81. #endif
  82. memset(head,-,sizeof(head));
  83. N=read(),K=read();
  84. S=,T=*N+;
  85. for(int i=;i<=N;i++)
  86. {
  87. L[i]=read();R[i]=read();
  88. date[++tot]=L[i],
  89. date[++tot]=R[i];
  90. }
  91. sort(date+,date+N*+);
  92. int num=unique(date+,date+*N+)-date-;
  93. for(int i=;i<=N;i++)
  94. L[i]=lower_bound(date+,date+num-,L[i])-date,
  95. R[i]=lower_bound(date+,date+num+,R[i])-date;
  96. for(int i=;i<=num-;i++)
  97. AddEdge(i,i+,,INF);
  98. for(int i=;i<=N;i++)
  99. AddEdge(L[i],R[i],-(date[R[i]]-date[L[i]]),);
  100. AddEdge(S,,,K);
  101. AddEdge(num,T,,INF);
  102. MCMF();
  103. return ;
  104. }

洛谷P3358 最长k可重区间集问题(费用流)的更多相关文章

  1. 洛谷P3357 最长k可重线段集问题(费用流)

    题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II ,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\subseteq IS⊆I ,使得在  ...

  2. 洛谷P3358 最长k可重区间集问题(费用流)

    传送门 因为一个zz错误调了一个早上……汇点写错了……spfa也写错了……好吧好像是两个…… 把数轴上的每一个点向它右边的点连一条边,容量为$k$,费用为$0$,然后把每一个区间的左端点向右端点连边, ...

  3. 洛谷 P3358 最长k可重区间集问题 【最大费用最大流】

    同 poj 3680 https:www.cnblogs.com/lokiii/p/8413139.html #include<iostream> #include<cstdio&g ...

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

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

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

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

  6. 网络流 P3358 最长k可重区间集问题

    P3358 最长k可重区间集问题 题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k, ...

  7. 【网络流24题】最长k可重线段集(费用流)

    [网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...

  8. 洛谷P3357 最长k可重线段集问题(费用流)

    传送门 其实和最长k可重区间集问题差不多诶…… 把这条开线段给压成x轴上的一条线段,然后按上面说的那种方法做即可 然而有一个坑点是线段可以垂直于x轴,然后一压变成一个点,连上正权环,求最长路……然后s ...

  9. 洛谷 P3357 最长k可重线段集问题【最大流】

    pre:http://www.cnblogs.com/lokiii/p/8435499.html 和最长k可重区间集问题差不多,也就是价值的计算方法不一样,但是注意这里可能会有x0==x1的情况也就是 ...

随机推荐

  1. 【Oracle】DBMS_STATS.GATHER_TABLE_STATS分析表

    表分析,简单的说,就是收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径.通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以进行优化. 语法: DBMS_STAT ...

  2. 【SQL】SELECT 语句

    1.1 SELECT基本语法: Select * |{[distinct]colum|expression [alias],…} from table; 1.2 查询当前用户所有在用的表及视图: HR ...

  3. [oracle] 递归追溯完整部门名称 函数

    create or replace function fn_DeptWholeName2(objectid in number) return nvarchar2 is wholename nvarc ...

  4. box-shadow 阴影剖析

    box-shadow的四个值分别是左右偏移,上下偏移,向四周模糊扩算,距离四周边缘的距离,最后一个是阴影的颜色值,如图示例: 上代码,复制代码,就可以看到上图的效果 <!DOCTYPE html ...

  5. /proc/vmstat 详解

    参考 #cat /proc/vmstat nr_free_pages 20223354 nr_alloc_batch 899 nr_inactive_anon 393025 nr_active_ano ...

  6. POJ 3281 Dining[网络流]

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  7. JQ淡入淡出效果

    <script type="text/javascript"> //页面淡入淡出 $(document).ready(function() { $('body').hi ...

  8. BZOJ 2161 布娃娃 (主席树)

    题面 想了一个主席树做法 我们把每个区间的两个端点拆开 对$L,R$分别从小到大排序,分别从左到右依次把对应标号的$c_{i}$插入到权值主席树里 每次查询$p_{i}$,在排序后的$L,R$数组上分 ...

  9. CentOS 7下搭建高可用集群

    一 .安装集群软件 必须软件pcs,pacemaker,corosync,fence-agents-all,如果需要配置相关服务,也要安装对应的软件. 二.配置防火墙1.禁止防火墙和selinux# ...

  10. Windows常用软件

    目录 Uninstall Tool FACapture Unlocker Uninstall Tool Uninstall Tool 这是一款可以彻底删除应用的软件,能连通注册表内容一起删除. FAC ...