这题和3358一模一样,建模形式直接不用变,就两点不一样,一是len变化了,加入y后再更新即可,还有就是可能会出现x0=x1的情况,即一条开线段垂直x轴,如果我们依旧按照上一题的建图方法,就会出现负权环,无法跑出答案,我们就可以把一个点拆成入点和出点,这样无论是否是不是垂直都可以一样建,注意开long long,不开long long可能只有9分

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define lowbit(x) ((x)&(-x))
  4. #define sqr(x) ((x)*(x))
  5. typedef long long LL;
  6.  
  7. const int maxm = 1e5+;
  8. const LL INF = 0x3f3f3f3f3f3f3f3f;
  9.  
  10. struct edge{
  11. LL u, v, cap, flow, cost, nex;
  12. } edges[maxm];
  13.  
  14. struct Points{
  15. LL l, r, len;
  16. } point[];
  17.  
  18. LL head[maxm], cur[maxm], cnt, fa[<<], n, d[<<], allx[];
  19. bool inq[<<];
  20.  
  21. void init() {
  22. memset(head, -, sizeof(head));
  23. }
  24.  
  25. void add(int u, int v, LL cap, LL cost) {
  26. edges[cnt] = edge{u, v, cap, , cost, head[u]};
  27. head[u] = cnt++;
  28. }
  29.  
  30. void addedge(int u, int v, LL cap, LL cost) {
  31. add(u, v, cap, cost), add(v, u, , -cost);
  32. }
  33.  
  34. bool spfa(int s, int t, int &flow, LL &cost) {
  35. for(int i = ; i <= n+; ++i) d[i] = INF; //init()
  36. memset(inq, false, sizeof(inq));
  37. d[s] = , inq[s] = true;
  38. fa[s] = -, cur[s] = INF;
  39. queue<int> q;
  40. q.push(s);
  41. while(!q.empty()) {
  42. int u = q.front();
  43. q.pop();
  44. inq[u] = false;
  45. for(int i = head[u]; i != -; i = edges[i].nex) {
  46. edge& now = edges[i];
  47. int v = now.v;
  48. if(now.cap > now.flow && d[v] > d[u] + now.cost) {
  49. d[v] = d[u] + now.cost;
  50. fa[v] = i;
  51. cur[v] = min(cur[u], now.cap - now.flow);
  52. if(!inq[v]) {q.push(v); inq[v] = true;}
  53. }
  54. }
  55. }
  56. if(d[t] == INF) return false;
  57. flow += cur[t];
  58. cost += 1LL*d[t]*cur[t];
  59. for(int u = t; u != s; u = edges[fa[u]].u) {
  60. edges[fa[u]].flow += cur[t];
  61. edges[fa[u]^].flow -= cur[t];
  62. }
  63. return true;
  64. }
  65.  
  66. int MincostMaxflow(int s, int t, LL &cost) {
  67. cost = ;
  68. int flow = ;
  69. while(spfa(s, t, flow, cost));
  70. return flow;
  71. }
  72.  
  73. void run_case() {
  74. init();
  75. LL l, r, y1, y2;
  76. int k, xcnt = ;
  77. cin >> n >> k;
  78. for(int i = ; i <= n; ++i) {
  79. cin >> l >> y1 >> r >> y2;
  80. LL tmp = 1LL*floor(sqrt(sqr(r-l)+sqr(y2-y1)));
  81. if(l > r) swap(l, r);
  82. l <<= , r <<= ;
  83. if(l == r) r|=; else l|=;
  84. allx[++xcnt] = l, allx[++xcnt] = r, point[i] = Points{l, r, tmp};
  85. }
  86. sort(allx+,allx++xcnt);
  87. int len = unique(allx+,allx++xcnt)-allx;
  88. for(int i = ; i <= n; ++i) {
  89. point[i].l = lower_bound(allx+,allx+len,point[i].l)-allx;
  90. point[i].r = lower_bound(allx+,allx+len,point[i].r)-allx;
  91. }
  92. for(int i = ; i < len-; ++i)
  93. addedge(i, i+, INF, );
  94. int s = , t = len;
  95. for(int i = ; i <= n; ++i) {
  96. addedge(point[i].l, point[i].r, , -point[i].len);
  97. }
  98. addedge(s, , k, ), addedge(len-, t, k, );
  99. LL cost = ;
  100. n = len;
  101. MincostMaxflow(s, t, cost);
  102. cout << -cost;
  103. }
  104.  
  105. int main() {
  106. ios::sync_with_stdio(false), cin.tie();
  107. run_case();
  108. cout.flush();
  109. return ;
  110. }

luogu P3357 最长k可重线段集问题的更多相关文章

  1. P3357 最长k可重线段集问题 网络流

    P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. (luogu P3358)最长k可重区间集问题 [TPLY]

    最长k可重区间集问题 题目链接 https://www.luogu.org/problemnew/show/3358 做法 所有点向下一个点连容量为k费用为0的边 l和r连容量为1费用为区间长度的边 ...

随机推荐

  1. VS中使用C的一些函数报错的问题

    VS建议采用带_s的函数,如scanf_s.strcpy_s,但这些并不是标准C函数. 要想继续使用此函数,需要在源文件中添加以下指令就可以避免这个错误提示: #define _CRT_SECURE_ ...

  2. 【SSM】Log4j 日志配置

    1.log4j.properties ### 配置根 ### # log4j.rootLogger = debug,console ,fileAppender,dailyRollingFile,ROL ...

  3. QWidget: “Must construct a QApplication before a QWidget”

    最近在做一个关于Qt的项目,在debug版本中没有任何问题,所以就想看看在Release版本下的运行情况,结果在开始运行时,出现如下图1-1所示的错误.在网上搜索答案,大多数是关于QWidget: M ...

  4. 《程序之美系列(套装共6册)》[美]斯宾耐立思 等 (作者) epub+mobi+azw3

    <架构之美>内容包括:facebook的架构如何建立在以数据为中心的应用生态系统之上.xen的创新架构对操作系统未来的影响.kde项目的社群过程如何让软件的架构从粗略的草图成为漂亮的系统. ...

  5. Nginx禁止使用ip访问,只允许使用域名访问

    Nginx虚拟主机配置,vhosts下面有很多域名的配置: [root@external-lb01 vhosts]# pwd/data/nginx/conf/vhosts [root@external ...

  6. 解决方法:Could not load file or assembly 'WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.

    最近使用VS2015调试ASP.NET 程序遇到了该问题: 在网上找了很多方法都不能解决,最后自己解决了,方法如下: 在project -> NuGet管理中找到已安装的所有程序:将Web Op ...

  7. 操作系统OS,Python - 生产者消费者模型

    1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题.(生产者和消费者不直接通信) 2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度. 3. 在并发编程中该模式能解决大多数 ...

  8. 奖学金(0)<P2007_1>

    奖学金 (scholar.pas/c/cpp) [问题描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分 ...

  9. Vacuum Pump Manufacturer - Vacuum Pump Range Use: Considerations

    The vacuum pump is a versatile bottle that holds your lotion, shampoo and conditioner. Keep away fro ...

  10. Apache Shiro安全(权限框架)学习笔记一

    1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法 2. AuthorizingRealm 类继承自 Authenticating ...