[网络流24题] 最长k可重区间集问题 (费用流)
很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解
发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形。
那就让它在序列上待着吧= =
对于一个区间,左端点向右端点连边,流量为$1$,费用为区间长度
对于一个位置$i$,向$i+1$连边,流量为$K$,费用为$0$
为什么要这么建图呢?
假设有$1$流量流到了位置$i$,有两种情况
1.选择一个从i开始的区间$[i,r]$,这点流量流到了$r$位置。而在$(i,r)$内,这点流量不能用于其它区间,达到了限制区间个数的目的,然后我们获得了$r-i$点收益
2.不选任何区间,流量流到了$i+1$位置,为后面的区间提供流量
然后跑最大费用最大流就行了
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 2005
#define M1 100100
#define ll long long
#define dd double
#define inf 0x3f3f3f3f
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,K,S,T;
struct Edge{
int head[N1],to[M1<<],nxt[M1<<],flow[M1<<],dis[M1<<],cte;
void ae(int u,int v,int F,int D)
{
cte++; to[cte]=v; flow[cte]=F; dis[cte]=D;
nxt[cte]=head[u]; head[u]=cte;
}
}e; int que[M1<<],hd,tl,dis[N1],id[N1],flow[N1],use[N1];
int spfa()
{
int x,j,v;
memset(dis,-,sizeof(dis)); memset(flow,,sizeof(flow)); memset(use,,sizeof(use));
hd=,tl=; que[++tl]=S; dis[S]=; use[S]=; flow[S]=inf;
while(hd<=tl)
{
x=que[hd++];
for(j=e.head[x];j;j=e.nxt[j])
{
v=e.to[j];
if( e.flow[j]> && dis[v]<dis[x]+e.dis[j] )
{
dis[v]=dis[x]+e.dis[j];
flow[v]=min(flow[x],e.flow[j]);
que[++tl]=v; id[v]=j; use[v]=;
}
}
use[x]=;
}
return dis[T]!=-;
}
int EK()
{
int tcost=,mxflow=,x;
while(spfa())
{
mxflow+=flow[T]; tcost+=flow[T]*dis[T];
for(x=T;x!=S;x=e.to[id[x]^])
{
e.flow[id[x]]-=flow[T];
e.flow[id[x]^]+=flow[T];
}
}
return tcost;
} int l[N1],r[N1],len[N1],t[N1<<],cnt;
int main()
{
scanf("%d%d",&n,&K);
int i,j,x,y,ma; e.cte=;
for(i=;i<=n;i++)
{
l[i]=gint(),r[i]=gint()-; if(l[i]>r[i]) swap(l[i],r[i]);
t[++cnt]=l[i]; t[++cnt]=r[i]; len[i]=r[i]-l[i]+;
}
sort(t+,t+cnt+); cnt=unique(t+,t+cnt+)-(t+);
for(i=;i<=n;i++) l[i]=lower_bound(t+,t+cnt+,l[i])-t;
for(i=;i<=n;i++) r[i]=lower_bound(t+,t+cnt+,r[i])-t;
S=; T=cnt+;
for(i=;i<=n;i++) e.ae(l[i],r[i]+,,len[i]), e.ae(r[i]+,l[i],,-len[i]);
for(i=;i<=cnt;i++) e.ae(i,i+,K,), e.ae(i+,i,,); e.ae(S,,K,); e.ae(,S,,);
printf("%d\n",EK());
return ;
}
[网络流24题] 最长k可重区间集问题 (费用流)的更多相关文章
- [网络流24题] 最长k可重线段集问题 (费用流)
洛谷传送门 LOJ传送门 最长k可重区间集问题的加强版 大体思路都一样的,不再赘述,但有一些细节需要注意 首先,坐标有负数,而且需要开$longlong$算距离 但下面才是重点: 我们把问题放到了二维 ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
- [网络流24题]最长k可重区间集[题解]
最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...
- [网络流24题] 最长k可重区间集
https://www.luogu.org/problemnew/show/3358 以区间(1,5),(2,6),(7,8)为例 建模方法一: 建模方法二: 离散化区间端点 相当于找k条费用最大的不 ...
- [网络流24题] 最长K可重区间集问题
题目链接:戳我 当时刷24题的时候偷了懒,没有写完,结果落下这道题没有写qwq结果今天考试T3中就有一部分要用到这个思想,蒟蒻我硬是没有想到网络流呜呜呜 最大费用流. 就是我们考虑将问题转化一下,转化 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
- [网络流24题]最长k可重线段集[题解]
最长 \(k\) 可重线段集 题目大意 给定平面 \(x-O-y\) 上 \(n\) 个开线段组成的集合 \(I\) ,和一个正整数 \(k\) .试设计一个算法,从开线段集合 \(I\) 中选取开线 ...
- 洛谷P3358 最长k可重区间集问题(费用流)
题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...
- 网络流24题-最长k可重线段集问题
最长k可重线段集问题 时空限制1000ms / 128MB 题目描述 给定平面 x−O−y 上 n 个开线段组成的集合 I,和一个正整数 k .试设计一个算法,从开线段集合 I 中选取出开线段集合 S ...
随机推荐
- windows集成身份验证
集成windows身份验证 这种验证方式里面也分为两种情况 NTLM验证 这种验证方式需要把用户的用户名和密码传送到服务端,服务端验证用户名和密码是否和服务器的此用户的密码一致.用户名用明码传送,但是 ...
- [bzoj2600][Ioi2011]ricehub_二分
ricehub bzoj-2600 Ioi-2011 题目大意:在数轴上有r块稻田,稻田坐标为整数.计划建造一个米仓,使得它可以收取尽量多的稻米.米仓的坐标仍需为整数.每一块权值为val的稻田距离米仓 ...
- jQuery高性能自己定义滚动栏美化插件
malihu是一款高性能的滚动栏美化jQuery插件. 该滚动栏美化插件支持水平和垂直滚动栏,支持鼠标滚动,支持键盘滚动和支持移动触摸屏. 而且它能够和jQuery UI和Bootatrap完美的结合 ...
- java封装AES加密算法
在实际coding中会常常遇到往数据库存入密码时加密.URL传參时的加密.由此简单封装了下java中的AES加密算法. 0.import类 import java.security.SecureRan ...
- SQL SEVER 元年是1900年
用SQL语句求 本月第一天,怎么写? 可以这样写: SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0); 按照日期函数DATEDIFF的定义,第二个参数是开始日 ...
- 在Spring Boot中使用Spring-data-jpa实现分页查询
转自:https://www.cnblogs.com/sandea/p/8275890.html 在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列 ...
- JavaScript扩展运算符(...)
对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩展运算符将其属性x,y一并拷贝到b对象中. 合并两个 ...
- 数组和String调用方法时,值是否改变(包含可变参数)
package com.wh.encapsulation; import java.util.Arrays; /** * @author 王恒 * @datetime 2017年4月5日 上午9:33 ...
- CMD-echo
echo 打印 <> echo ^< echo ^> echo 换行 echo 你好@echo.世界. echo 多行打印 > log.log 此时 > 无效.(我 ...
- DWR框架在web.xml的完整配置及注释
<!-- 配置DWR框架 --> <servlet> <servlet-name>dwr</servlet-name> <servlet-clas ...