(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,分别表示开区间的个数和开区间的可重 ...
随机推荐
- 网络服务器操作命令telnet
有些命令是内部的,系统自带的,在装好系统后,就可以随时使用有些命令是系统中没有的,要自己安装一下才能使用,比如你说的telnet,需要安装一下才能使用的.CentOS中用 yum install te ...
- Qt滑动条设计与实现
没有找到Qt的滑动条控件,所以自己写了一个,能够实现亮度调节.音量调节等功能. 效果如下图: 主要设计思路: 有些调节功能如对比度是有负值的,所以需要能对滑动条的数值范围进行设置,不局限于0~100 ...
- Thrift入门
简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Has ...
- shell编程之环境变量配置文件(4)
1 source命令 修改了配置文件,并让它立刻生效,而不用重新登录 source 配置文件 或者 .配置文件 2 环境变量配置文件简介 PATH HISTSIZE PS1 HOSTNAME等环境变量 ...
- centos7使用docker部署gitlab-ce-zh应用
1.国内拉取镜像比较慢,所以这里采用DaoCloud源. # curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http ...
- 二、Item Pipeline和Spider-----基于scrapy取校花网的信息
Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...
- chrome浏览器下JavaScript实现clipboard时无法访问剪切板解决方案
在用JavaScript实现某个简单的复制到剪切板功能的时候,会考虑一下浏览器兼容性,主要是重点在IE和FireFox,把这个两个浏览器搞定后,基本上其他浏览器也不用太操心了,Chrome也一样,没出 ...
- qt 字符数组如何转换字符串?
char 字符数组如何转换成 QString? char source{1024} = {0}; QString des = QString::fromLocal8Bit(source);
- POJ - 2912 Rochambeau 种类并查集
题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的.这些小朋友中有一个是裁判,他可以随便出手势.现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判. 思路:枚举每 ...
- POJ - 3279 枚举 [kuangbin带你飞]专题一
这题很经典啊,以前也遇到过类似的题--计蒜客 硬币翻转. 不过这题不仅要求翻转次数最少,且翻转方案的字典序也要最小. 解法:二进制枚举第一行的翻转方案,然后处理第二行,如果第二行的k列的上一列是黑色, ...