(luogu P3358)最长k可重区间集问题 [TPLY]
最长k可重区间集问题
题目链接 https://www.luogu.org/problemnew/show/3358
做法
所有点向下一个点连容量为k费用为0的边
l和r连容量为1费用为区间长度的边
然后跑最大流最大费用流
(最大费用就是把边权取相反数跑最小费用
最后再输出最终费用的相反数)
思考
在整张图中,只有l - >r的边有费用
而且费用为区间长度
(i->i+1费用为0)
所以跑最大费用也就是求最长区间
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define ul unsigned long long
#define rg register int
#define ll long long
#define il inline
#define INF 2147483647
#define SZ 10000000
using namespace std;
int n,N,k,s,t,a[SZ],l[SZ],r[SZ];
/* N : 原数组大小
n : 离散化之后的数组大小
a[] : 离散数组
k : 可重迭数
l , r 所给区间左端点和右端点
*/
struct Edge{int to,nxt,w,c;}e[SZ];
int Ehead[SZ],pv[SZ],pe[SZ],Ecnt=2;
il void Eadd(int u,int v,int w,int cost)
{
e[Ecnt]=(Edge){v,Ehead[u],w,cost};
Ehead[u]=Ecnt++;
e[Ecnt]=(Edge){u,Ehead[v],0,-cost};
Ehead[v]=Ecnt++;
}
/* 加边函数
pv[i] : spfa时使得i点dis值松弛的节点
(最短路的上一节点)
pe[i] : i与pv[i]连接的边
e[i].w : 流量
e[i].c : 费用
*/
// 费用流板子 '_'↓↓↓
ll dis[SZ];
int vis[SZ];
queue <int> Q;
bool spfa()
{
memset(dis,63,sizeof(dis));
dis[s]=0; Q.push(s);
while(!Q.empty())
{
rg u=Q.front();
Q.pop();
for(rg i=Ehead[u];i;i=e[i].nxt)
{
rg v=e[i].to;
if((e[i].w)&&(dis[v]>dis[u]+e[i].c))
{
dis[v]=dis[u]+e[i].c;
pe[v]=i;
pv[v]=u;
if(!vis[v])
{
vis[v]=1;
Q.push(v);
}
}
}
vis[u]=0;
}
return dis[t]<dis[0];
}
il void costflow()
{
ll Ans=0;
while(spfa())
{
rg di=INF;
for(rg i=t;i!=s;i=pv[i])
di=min(di,e[pe[i]].w);
for(rg i=t;i!=s;i=pv[i])
{
e[pe[i]].w-=di;
e[pe[i]^1].w+=di;
Ans+=1ll*di*e[pe[i]].c;
}
}
printf("%lld",-Ans);
}
// 费用流板子 '_'↑↑↑
int main()
{
scanf("%d%d",&N,&k);
for(rg i=1;i<=N;++i)
{
scanf("%d%d",&l[i],&r[i]);
if(l[i]>r[i]) swap(l[i],r[i]);
a[i]=l[i];a[i+N]=r[i];
}
sort(a+1,a+N+N+1);
n=unique(a+1,a+N+N+1)-a-1;
for(rg i=1;i<=N;++i)
{
rg L=lower_bound(a+1,a+n+1,l[i])-a;
rg R=lower_bound(a+1,a+n+1,r[i])-a;
Eadd(L,R,1,l[i]-r[i]);
}
/* 利用unique和lower_bound离散化
原理是把输入到l[i]与r[i]出现的所有数字
排完序后利用unique去重
注意那些+1-1什么的
*/
for(rg i=1;i<n;++i)
Eadd(i,i+1,INF,0);
s=n+1;t=n+2;
Eadd(s,1,k,0);
Eadd(n,t,k,0);
costflow();
while(1);
return 0;
}
(luogu P3358)最长k可重区间集问题 [TPLY]的更多相关文章
- luogu P3358 最长k可重区间集问题
网络流建图好难,这题居然是网络流(雾,一般分析来说,有限制的情况最大流情况可以拆点通过capacity来限制,比如只使用一次,把一个点拆成入点出点,capacity为1即可,这题是限制最大k重复,可以 ...
- 网络流 P3358 最长k可重区间集问题
P3358 最长k可重区间集问题 题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k, ...
- 洛谷P3358 最长k可重区间集问题(费用流)
题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...
- 【Luogu】P3358最长k可重区间集问题(费用流)
题目链接 这题费用瘤,数据貌似还是错的. 把线段抽象抽象拆成两个点,入点表示左端,出点表示右端,连上容量为1费用-长度的边. 不相交线段随便连下,源点向拆出的原点S'连费用为0容量k,然后跑费用流. ...
- P3358 最长k可重区间集问题
题目链接 \(Click\) \(Here\) 这题的写法非常巧妙. 每个位置的点向它的下一个位置连一个容量为\(INF\)的边,从区间的左端点往右端点拉一条容量为\(1\),费用为区间长度的边,从起 ...
- 洛谷P3358 最长k可重区间集问题(费用流)
传送门 因为一个zz错误调了一个早上……汇点写错了……spfa也写错了……好吧好像是两个…… 把数轴上的每一个点向它右边的点连一条边,容量为$k$,费用为$0$,然后把每一个区间的左端点向右端点连边, ...
- 洛谷 P3358 最长k可重区间集问题 【最大费用最大流】
同 poj 3680 https:www.cnblogs.com/lokiii/p/8413139.html #include<iostream> #include<cstdio&g ...
- 最长k可重区间集
P3358 最长k可重区间集问题 P3357 最长k可重线段集问题 P3356 火星探险问题 P4012 深海机器人问题 P3355 骑士共存问题 P2754 [CTSC1999]家园 题目描述 ...
- 「网络流24题」「LuoguP3358」 最长k可重区间集问题(费用流
题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...
随机推荐
- Go生成easyjson文件
[生成easyjson文件] cd services/api_adapter/aliafp #先删除已有的aliafp_easyjson.go文件,并且把除了aliafp.go以外的其他文件移动到 ...
- Redis进阶实践之十二 Redis的Cluster集群动态扩容
一.引言 上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cl ...
- 基于微软企业库的AOP组件(含源码)
软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...
- Java经典编程题50道之三
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1的三次 ...
- echarts legend 重叠 (转载)
解决方案: 1. 调整option中的grid.top值才能避免重叠:(可以设置定制,也可以定义了一个计算公式) 2. 文档注明[特殊字符串 ''(空字符串)或者 '\n' (换行字符串)用于图例的 ...
- Date 类
一.Date类型的初始化 1. Date(int year, int month, int date); 直接写入年份是得不到正确的结果的. 因为java中Date是从1900年开始算的,所以前面的第 ...
- 沉淀,再出发——安装windows10和ubuntu kylin15.04双系统心得体会
安装windows10和ubuntu kylin15.04双系统心得体会 一.安装次序 很简单,两种安装次序,"先安装windows后安装linux:先安装linux后安装wind ...
- 1.10 tuple 元组
元组(tuple)属于不可变序列 tuple特性: 特性一:可包含任意对象的有序集合 特性二:通过下标索引访问元素 特性三:固定长度,异质,可任意嵌套 特性四:不支持原位改变 特性五:存储机制:对象引 ...
- spring-boo hello world程序
作为一个程序猿,使用了spring好多年,现在有了spring-boot,也想尝尝鲜. 初听spring-boot,觉得很神秘,实际上就是集合了很多组件,再加上一些boot开发的启动和粘合程序. 个人 ...
- mysql数据库基本使用(增删改查)
数据库db,database 数据库:依照某种数据模型进行组织并存放到存储器的数据集合dbms,database management system 数据库管理系统:用来操作和管理数据库的大型服务软件 ...