题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
复制

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

15

说明

对于100%的数据,1<=n<=500,1<=k<=3

题解

建图:从$S$往$L$左端点连容量为k,费用为0;

从$L$上每个点$i$往点$i+1$连容量为INF,费用为0;

从$L$右端点往$T$连容量INF,费用为0。

>然后从每个区间的左端点往右端点连边,容量为1,费用为右端点$-$左端点(这道题区间长度的定义是右端点$-$左端点

然后跑最大费用最大流就行啦~

这样跑出来的费用会尽量大,而因为S处控制了流量,最大流就是k。

答案就是费用。

然后最大费用最大流就是把费用存负,跑最小费用最大流,输出答案的时候再取反就行了。

然后这道题长度没个范围,所以还要搞个离散。

 /*
qwerta
P3358 最长k可重区间集问题
Accepted
100
代码 C++,2.16KB
提交时间 2018-10-09 18:19:08
耗时/内存
31ms, 936KB
*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int INF=2e9;
struct emm{
int e,f,v,c;
}a[];
int h[];
int tot=;
void con(int x,int y,int v,int c)
{
a[++tot].f=h[x];
h[x]=tot;
a[tot].e=y;
a[tot].v=v;
a[tot].c=c;
a[++tot].f=h[y];
h[y]=tot;
a[tot].e=x;
a[tot].c=-c;
return;
}
struct ahh{
int l,r;
}b[];
int ls[];
int s,t;
queue<int>q;
bool sf[];
int dis[];
inline bool spfa()
{
memset(sf,,sizeof(sf));
memset(dis,,sizeof(dis));
sf[s]=;dis[s]=;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=h[x];i;i=a[i].f)
if(dis[a[i].e]>dis[x]+a[i].c&&a[i].v)
{
dis[a[i].e]=dis[x]+a[i].c;
if(!sf[a[i].e])
{
sf[a[i].e]=;
q.push(a[i].e);
}
}
sf[x]=;
}
return dis[t]<INF;
}
long long ans=;
int dfs(int x,int al)
{
sf[x]=;
if(x==t||!al)return al;
int fl=;
for(int i=h[x];i;i=a[i].f)
if(dis[a[i].e]==dis[x]+a[i].c&&a[i].v&&!sf[a[i].e])
{
int f=dfs(a[i].e,min(al,a[i].v));
if(f)
{
fl+=f;
al-=f;
ans+=f*a[i].c;
a[i].v-=f;
a[i^].v+=f;
if(!al)break;
}
}
if(!fl)dis[x]=-INF;
return fl;
}
int main()
{
//freopen("a.in","r",stdin);
int n,k;
scanf("%d%d",&n,&k);
int tol=;
for(int i=;i<=n;++i)
{
scanf("%d%d",&b[i].l,&b[i].r);
ls[++tol]=b[i].l;
ls[++tol]=b[i].r;
}
//离散
sort(ls+,ls+tol+);
int len=(unique(ls+,ls+tol+)-ls)-;//用unique去重
for(int i=;i<=n;++i)
{
int ll=lower_bound(ls+,ls+len+,b[i].l)-ls;
int rr=lower_bound(ls+,ls+len+,b[i].r)-ls;
con(ll,rr,,-(b[i].r-b[i].l));//建边
}
//
s=,t=len+;
for(int i=;i<len;++i)
con(i,i+,INF,);
con(s,,k,);
con(len,t,INF,);
//
while(spfa())
{
sf[t]=;
while(sf[t])
{
memset(sf,,sizeof(sf));
dfs(s,INF);
}
}
cout<<-ans;//输出再取个负就好了
return ;
}

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

  1. 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)

    [] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. DICOM医学图像处理:Deconstructed PACS之Orthanc,Modification & Anonymization

    背景: 上篇博文为引子,介绍了一款神奇的开源PACS系统——Orthanc.本篇开始解读官方Cookbook中的相关内容,对于简单的浏览.访问和上传请阅读前篇博文.在常规的PACS系统中还未出现对于D ...

  2. 转帖:HttpStatusCode状态说明C#版

    Continue 等效于 HTTP 状态 100.Continue 指示客户端可能继续其请求. SwitchingProtocols 等效于 HTTP 状态 101.SwitchingProtocol ...

  3. sql的一些知识_通配符

    like操作符 通配符只能用于字符串查询 % 指任意字符出现任意次数,包括0次,不包括NULL SELECT username,weight,age FROM userinfo WHERE usern ...

  4. hibernate session缓存

    Session 概述 Session 接口是 Hibernate 向应用程序提供的操纵数据库的最基本的接口, 它提供了基本的保存, 更新, 删除和载入 Java 对象的方法. Session 具有一个 ...

  5. Android MPAndroidCharts 框架 画可滑动查看的直方图

    1.由于公司项目的需求,所以花了1.2天研究 MPAndroidCharts框架 .可是发现好多博客对我都没得帮助.浪费非常多时间在百度上.不得不说google 真是比百度强太多了. 要求:统计出56 ...

  6. mqtt client python example

    This is a simple example showing how to use the [Paho MQTT Python client](https://eclipse.org/paho/c ...

  7. 将iconv编译成lua接口

    前一篇博文说了.在cocos2dx中怎么样使用iconv转码,这节我们将上一节中写的转码函数,做成一个lua接口.在lua脚本中使用. 网上能够下载到luaconv.可是编译的时候总是报错,所以自己写 ...

  8. 转:scanf的用法

    https://blog.csdn.net/u012421456/article/details/18501309 scanf()[通过键盘将数据输入到变量中] 它有两种用法: 用法一: scanf( ...

  9. OpenCV for Python 学习笔记 二

    今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/ ...

  10. cygwin配置个人环境,android模拟器root映象和Babun

    零.Windows命令行个人设置 @echo off :: Temporary system path at cmd startup ::set PATH=%PATH%;"C:\Progra ...