题目描述

对于给定的开区间集合 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. alibaba fastjson常见问题FAQ

    English | 中文 1. 怎么获得fastjson? 你可以通过如下地方下载fastjson: maven中央仓库: http://central.maven.org/maven2/com/al ...

  2. utuntu16.04安装tensorflow1.4-gpu

    之前一直在windows下使用tensorflow,对cpu和gpu的安装都是比较顺利,都是使用anaconda环境下,创建虚拟conda环境,这样方便不同python版本的管理. 一直也想尝试使用u ...

  3. Ural 2018The Debut Album(DP)

    题目地址:Ural 2018 简单DP.用滚动数组. 代码例如以下: #include <iostream> #include <cstdio> #include <st ...

  4. vue 给组件绑定原生事件

    有时候,你可能想在某个组件的根元素上监听一个原生事件.可以使用 v-on 的修饰符 .native.例如: <my-component v-on:click.native="doThe ...

  5. 手写AngularJS脏检查机制

    什么是脏检查 View -> Model 浏览器提供有User Event触发事件的API,例如,click,change等 Model -> View 浏览器没有数据监测API. Ang ...

  6. AsyncTask源代码解析

    快要毕业了.近期在阿里巴巴校园招聘面试,一面过了,感觉挺轻松,可能是运气好.面试官感觉比我腼腆一些.我俩从android绕到了spring mvc 到数据库悲观锁 到linux 然后又会到了andro ...

  7. man screen

    http://www.gnu.org/software/screen/manual/screen.html Screen User's Manual Next: Overview, Previous: ...

  8. Java 序列化Serializable具体解释(附具体样例)

    Java 序列化Serializable具体解释(附具体样例) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描写叙述的过程:反序列化deserializa ...

  9. caffe搭建--ubuntu标准平台的搭建

    http://caffe.berkeleyvision.org/install_apt.html Ubuntu Installation General dependencies sudo apt-g ...

  10. php 数组转xml 数组转json xml转数组 json转数组

    array->xml <?php function array2xml($array, $tag) { function ia2xml($array) { $xml="" ...