[网络流24题] 最长k可重线段集问题 (费用流)
最长k可重区间集问题的加强版
大体思路都一样的,不再赘述,但有一些细节需要注意
首先,坐标有负数,而且需要开$longlong$算距离
但下面才是重点:
我们把问题放到了二维平面内,如果出现了垂直于$x$轴的线段,该如何处理呢?直接当成线段处理显然不可取
假设这条线段的横坐标是$x$
1.它不会对从$x$开始的倾斜线段产生任何影响,但会和穿过$x$的倾斜直线抢位置
2.它会和同样在$x$垂直的线段抢位置
我用了一个比较笨的做法,先把横坐标离散,再把离散后的横坐标抻成原来的$2$倍,垂直线段横坐标为$2x-1$,倾斜线段横坐标是$2x$,问题就被解决了
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 2005
#define M1 200010
#define ll long long
#define dd double
#define inf 0x3f3f3f3f
#define maxn 100000
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]; id[v]=j;
flow[v]=min(flow[x],e.flow[j]);
if(!use[v]) que[++tl]=v, 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],p[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(), x=gint(), r[i]=gint(), y=gint();
if(l[i]>r[i]) swap(l[i],r[i]), swap(x,y);
len[i]=sqrt( 1ll*(r[i]-l[i])*(r[i]-l[i])+1ll*(y-x)*(y-x) );
if(l[i]!=r[i]) r[i]--; else p[i]=;
t[++cnt]=l[i], t[++cnt]=r[i];
}
sort(t+,t+cnt+); cnt=unique(t+,t+cnt+)-(t+);
for(i=;i<=n;i++)
{
x=lower_bound(t+,t+cnt+,l[i])-t;
y=lower_bound(t+,t+cnt+,r[i])-t;
if(p[i]){ l[i]=x*-, r[i]=y*-; }
else{ l[i]=x*; r[i]=y*; }
}
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传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...
- 网络流24题-最长k可重线段集问题
最长k可重线段集问题 时空限制1000ms / 128MB 题目描述 给定平面 x−O−y 上 n 个开线段组成的集合 I,和一个正整数 k .试设计一个算法,从开线段集合 I 中选取出开线段集合 S ...
- [网络流24题]最长k可重线段集[题解]
最长 \(k\) 可重线段集 题目大意 给定平面 \(x-O-y\) 上 \(n\) 个开线段组成的集合 \(I\) ,和一个正整数 \(k\) .试设计一个算法,从开线段集合 \(I\) 中选取开线 ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
- [网络流24题]最长k可重区间集[题解]
最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...
- [网络流24题] 最长k可重区间集
https://www.luogu.org/problemnew/show/3358 以区间(1,5),(2,6),(7,8)为例 建模方法一: 建模方法二: 离散化区间端点 相当于找k条费用最大的不 ...
- 洛谷P3357 最长k可重线段集问题(费用流)
题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II ,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\subseteq IS⊆I ,使得在 ...
- [网络流24题] 最长K可重区间集问题
题目链接:戳我 当时刷24题的时候偷了懒,没有写完,结果落下这道题没有写qwq结果今天考试T3中就有一部分要用到这个思想,蒟蒻我硬是没有想到网络流呜呜呜 最大费用流. 就是我们考虑将问题转化一下,转化 ...
随机推荐
- 楼控-西门子-insight使用-软件重新授权
在insight的使用中,可能会碰到insight的软件授权失败,此时需要重新将原授权删除,再重新将软件授权. 先看一下软件授权失效会出现什么: 再看看如何删除原来的密钥,再注册新的密钥.
- HDU 4518
整理一下思路,明天再写... 这道题,其实就是求包含大于10的斐波那切数字的第K(K是斐波那契数)个数.注意到斐波那契数的爆炸性增长,所以在范围 内的符合要求的F数并不多吧.比如求第K个F数,那么,前 ...
- 阶梯博弈&POJ 1704
阶梯博弈: 先借用别人的一幅图片.(1阶梯之前还有一个0阶梯未画出) 阶梯博弈的最初定义是这样的:每一个阶梯只能向它的前一个阶梯移动本阶梯的点,直至最后无法移动的为输. 那么,利用NIM,只计算奇数级 ...
- no projects are found to import
从svn上导出的项目在导入Eclipse中常常出现 no projects are found to import . 产生的原因是:项目文件里中没有".classpath"和&q ...
- [剑指offer]Q13:O(1)时间删除链表的结点
通常我们所说的删除链表的某个结点,是彻底删除该结点的空间.而要这么做就必须知道其前驱结点.这里的想法是,链表中存储的val是同类型的,仅仅要将该结点的val内容删除就能够了. 那么就能够用该结点的后继 ...
- redhat gitlab的搭建
http://www.cnblogs.com/derekchen/p/5870723.html 1.新建 /etc/yum.repos.d/gitlab-ce.repo,添加以下内容 [gitlab- ...
- SRM 622 D2L3: Subsets, math, backtrack
题目:http://community.topcoder.com/stat?c=problem_statement&pm=10554&rd=15855 符合条件的集中非1的元素个数是非 ...
- ES Segment Memory——本质上就是segment中加到内存的FST数据,因此segment越多,该内存越大
ElasticSearch优化系列四:ES的heap是如何被瓜分掉的 转自:https://www.jianshu.com/p/f41b706db6c7 以下分别解读几个我知道的内存消耗大户: Seg ...
- JavaScript:DOM对象
ylbtech-JavaScript:DOM对象 1. HTML DOM Document 对象返回顶部 1. HTML DOM Document 对象 HTML DOM 节点 在 HTML DOM ...
- 应用MVP模式对遗留代码进行重构
AV(Autonomous View)自治视图 在面向终端用户的应用中,都需要一个可视化的UI来与用户交互.这个UI称为View视图. 在早期,我们习惯将所有前台的逻辑,与视图揉在一起,称为AV自治视 ...