最长k可重区间集
P3358 最长k可重区间集问题
题目描述

对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度。
输入输出格式
输入格式:
的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重迭数。接下来的 n行,每行有 2 个整数,表示开区间的左右端点坐标。
输出格式:
将计算出的最长 k可重区间集的长度输出
输入输出样例
4 2
1 7
6 8
7 10
9 13
15
说明
对于100%的数据,1≤n≤500 ,1≤k≤3。
这个题貌似之前不停地打开然后放弃掉。。貌似主要原因是看不懂题面让我干些什么。。。上午的考试让我有了充足的时间观察题面,发现道理就是给了一堆区间,然后每个点不能被超过k个区间覆盖,每个区间的价值是它的长度,求最大价值。
然后一开始的时候一直都是想着怎么把互相覆盖这个条件把握好,然后各种如果他们有交集就连边之类的。。。后来发现并不可行,总是无法维护好。
然后看了题解豁然开朗,貌似自己的拆点连边什么的都没什么问题,甚至伪超级源这种东西都想到了,然而思路还是局限了我,这个题要向与自己没有交集的区间连边。然后去跑最大费用即可。。。真是可惜了。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#define ll long long
#define inf 50000000
#define re register
#define min(a,b) a<b?a:b
using namespace std;
struct po{
int nxt,to,w,dis;
};
po edge[];
struct len{
int l,r;
};
len a[];
int head[],num=-,n,m,s,t,k,S;
int dis[],b[],tot;
inline int read()
{
int x=,c=;
char ch=' ';
while((ch>''||ch<'')&&ch!='-')ch=getchar();
while(ch=='-')c*=-,ch=getchar();
while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
return x*c;
}
inline void add_edge(int from,int to,int w,int dis)
{
edge[++num].nxt=head[from];
edge[num].to=to;
edge[num].w=w;
edge[num].dis=dis;
head[from]=num;
}
inline void add(int from,int to,int w,int dis)
{
add_edge(from,to,w,dis);
add_edge(to,from,,-dis);
}
inline bool spfa()
{
memset(dis,,sizeof(dis));
memset(b,,sizeof(b));
deque<int> q;
dis[t]=;
b[t]=;
q.push_back(t);
while(!q.empty()){
int u=q.front();
q.pop_front();
b[u]=;
for(re int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(edge[i^].w>&&dis[v]>dis[u]-edge[i].dis){
dis[v]=dis[u]-edge[i].dis;
if(!b[v]){
b[v]=;
if(!q.empty()&&dis[v]<dis[q.front()])
q.push_front(v);
else
q.push_back(v);
}
}
}
}
return dis[s]<inf;
}
inline int dfs(int u,int low)
{
b[u]=;
if(u==t)
return low;
int diss=;
for(re int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(edge[i].w&&!b[v]&&dis[v]==dis[u]-edge[i].dis){
int check=dfs(v,min(low,edge[i].w));
if(check){
tot+=edge[i].dis*check;
low-=check;
diss+=check;
edge[i].w-=check;
edge[i^].w+=check;
if(low==) break;
}
}
}
return diss;
}
inline int max_flow(){
int ans=;
while(spfa()){
b[t]=;
while(b[t]){
memset(b,,sizeof(b));
ans+=dfs(s,inf);
}
}
}
inline bool cmp(len x,len y)
{
if(x.l<y.l) return ;
else if(x.l==y.l&&x.r<y.r) return ;
return ;
}
int main()
{
memset(head,-,sizeof(head));
n=read();k=read();
s=;t=n+n+;
S=n+n+;
add(s,S,k,);
for(re int i=;i<=n;i++){
a[i].l=read();a[i].r=read();
if(a[i].l>a[i].r) swap(a[i].l,a[i].r);
}
sort(a+,a+n+,cmp);
for(re int i=;i<n;i++)
for(re int j=i+;j<=n;j++)
if(a[i].r<=a[j].l) add(i+n,j,,);
for(re int i=;i<=n;i++){
add(S,i,,);add(i+n,t,,);add(i,i+n,,-a[i].r+a[i].l);
}
max_flow();
cout<<-tot;
}
最长k可重区间集的更多相关文章
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
- 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)
[] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...
- (luogu P3358)最长k可重区间集问题 [TPLY]
最长k可重区间集问题 题目链接 https://www.luogu.org/problemnew/show/3358 做法 所有点向下一个点连容量为k费用为0的边 l和r连容量为1费用为区间长度的边 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
- 【网络流24题21】最长k可重区间集问题
题面戳我 题目描述 对于给定的开区间集合I和正整数k,计算开区间集合I的最长k可重区间集的长度. 输入格式: 的第 1 行有 2 个正整数n和k,分别表示开区间的个数和开区间的可重迭数.接下来的 n行 ...
- 网络流 P3358 最长k可重区间集问题
P3358 最长k可重区间集问题 题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k, ...
- LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 ...
- 【刷题】LOJ 6014 「网络流 24 题」最长 k 可重区间集
题目描述 给定实直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取出开区间集合 \(S \subseteq ...
- [网络流24题] 最长k可重区间集
https://www.luogu.org/problemnew/show/3358 以区间(1,5),(2,6),(7,8)为例 建模方法一: 建模方法二: 离散化区间端点 相当于找k条费用最大的不 ...
- loj #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...
随机推荐
- Laravel5.1 模型初探
Laravel的模型也是访问数据库的,它更加面向对象,一个模型对应着一张表 我们可以使用模型对数据做一些增删改查的操作. 1 创建模型 创建模型是可以使用Artisan控制台的: php artisa ...
- python3 - 生成器genarator
在Python中,这种一边循环一边计算的机制,称为生成器:generator. 生成器保存的是算法,每次调用 next() ,就计算出 下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 ...
- C++编译过程与内存空间
为什么须要知道C/C++的内存布局和在哪能够能够找到想要的数据?知道内存布局对调试程序很有帮助,能够知道程序运行时,究竟做了什么,有助于写出干净的代码.本文的主要内容例如以下: 源文件转换为可运 ...
- 利用.Net中Process类调用netstat命令来判断计算端口的使用情况
利用.Net中Process类调用netstat命令来判断计算端口的使用情况: Process p = new Process();p.StartInfo = new ProcessStartInfo ...
- windows下 兼容Python2和Python3
windows下同时安装了python2和python3时,都可以配置环境变量,如果在命令行里输入python命令,windows会去环境变量里寻找Python的安装位置,如果先找到pytoon2的, ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)
(三)视图 与传统意义上的数据视图类似,SharePoint中的列表视图指定了列表中数据的筛选条件.排序条件.分组条件.显示栏/字段.显示条目数.显示样式等内容.在SharePoint中,使用SPVi ...
- jPage.js分页
jPage.js插件使用文档 这一款插件主要是为了bootstrap原生的分页功能效果不理想而诞生的一款插件. jPage.js代码更新地址为:https://github.com/leslieSie ...
- setlocale同mbstowcs函数的关系(VS2008下setlocale(LC_ALL, "chs")可以执行成功,BCB使用setlocale(LC_ALL, "Chinese (Simplified)_People's Republic of China"),linux上locale别名表大概在 /usr/lib/X11/locale/locale.alias)
序中,如果要将ASCII码字符串转换为宽字符(Unicode),可以利用标准C的mbstowcs函数. 微软在MSDN中有示例,如下: 然而,这段代码在处理含有汉字的字符串时就会出现问题.比如将: w ...
- MySQL中事务的分类
从事务理论的角度来看,可以把事务分为以下几种类型 扁平事务(Flat Transactions) 带有保存点的扁平事务(Flat Transactions with Savepoints) 链事务(C ...
- python基础——函数参数
课上老师已经讲过函数(func)的参数(args)传递. 之前学习了根据位置传递对应的参数,下面会介绍其他参数传递方式. 之前的位置传参: def f(a,b,c): return a+b+c pri ...