题目描述

对于给定的开区间集合 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. C#中toolStrip或statusStrip遮挡了SplitContainer怎么办?

    如果在一个项目中先增添了SplitContainer,然后再添加的Toolbar或statusStrip,结果后者把前者上部或下部挡住了一条,造成界面别扭. 解决办法是右键点击Toolba或statu ...

  2. mysql 导入sql文件时自动切换了大小写

    windows环境下: 解决办法(即将其改为大小写敏感): 在my.ini中添加 lower_case_table_names=1

  3. SolidEdge 打开工程图提示图纸已过期怎么办

    如下图所示,打开工程图时提示图纸已过期   点击工具-图纸视图跟踪器,按提示打开过期的装配体文件   更新这个装配体文件   然后切换到刚才提示过期的工程图文件,点击更新视图,下次再打开的时候就不会提 ...

  4. selector在手机上或浏览器显示各种姿势(虚拟下拉菜单)

    测试机型:小米.华为.苹果 测试浏览器:Chrome.Safari.Firefox 最后的结果就是你搞你的,我搞我的! 我认为这样漂亮,你认为那样漂亮(我认为你们都统一!) 因为项目时间紧,所以直接用 ...

  5. Linux mm相关的问题

    [S]为什么High MEM是从896M開始的? As the running kernel needs these functions, a region of at least VMALLOC_R ...

  6. java要在命令行执行eclipse的项目的方法

    在命令行运行eclipse的项目时须要把该项目生成一个能够运行的jar包,才干够在命令行下运行:分为两种情况,一种是项目中没有调用第三方的jar包,这样的比較简单.网上的资源也非常多,本文主要讲述第二 ...

  7. linux下的环境文件设置说明

    工作环境设置文件 环境设置文件有两种:系统环境设置文件 和 个人环境设置文件   1.系统中的用户工作环境设置文件:   登录环境设置文件:/etc/profile        非登录环境设置文件: ...

  8. Google架构学习

    http://hideto.iteye.com/blog/130815 原文:Google Architecture Google是伸缩性的王者.Google一直的目标就是构建高性能高伸缩性的基础组织 ...

  9. iOS 私有库的使用

    最近项目说要用私有库 主要过程 创建两个库:  索引库   组件库 组件库  用git操作  比如更新代码 push   打tag等 索引库  存放组件的描述信息 也就是 .spec文件 这个文件和 ...

  10. PHP魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } //魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ public ...