luogu P3357 最长k可重线段集问题
这题和3358一模一样,建模形式直接不用变,就两点不一样,一是len变化了,加入y后再更新即可,还有就是可能会出现x0=x1的情况,即一条开线段垂直x轴,如果我们依旧按照上一题的建图方法,就会出现负权环,无法跑出答案,我们就可以把一个点拆成入点和出点,这样无论是否是不是垂直都可以一样建,注意开long long,不开long long可能只有9分
- #include<bits/stdc++.h>
- using namespace std;
- #define lowbit(x) ((x)&(-x))
- #define sqr(x) ((x)*(x))
- typedef long long LL;
- const int maxm = 1e5+;
- const LL INF = 0x3f3f3f3f3f3f3f3f;
- struct edge{
- LL u, v, cap, flow, cost, nex;
- } edges[maxm];
- struct Points{
- LL l, r, len;
- } point[];
- LL head[maxm], cur[maxm], cnt, fa[<<], n, d[<<], allx[];
- bool inq[<<];
- void init() {
- memset(head, -, sizeof(head));
- }
- void add(int u, int v, LL cap, LL cost) {
- edges[cnt] = edge{u, v, cap, , cost, head[u]};
- head[u] = cnt++;
- }
- void addedge(int u, int v, LL cap, LL cost) {
- add(u, v, cap, cost), add(v, u, , -cost);
- }
- bool spfa(int s, int t, int &flow, LL &cost) {
- for(int i = ; i <= n+; ++i) d[i] = INF; //init()
- memset(inq, false, sizeof(inq));
- d[s] = , inq[s] = true;
- fa[s] = -, cur[s] = INF;
- queue<int> q;
- q.push(s);
- while(!q.empty()) {
- int u = q.front();
- q.pop();
- inq[u] = false;
- for(int i = head[u]; i != -; i = edges[i].nex) {
- edge& now = edges[i];
- int v = now.v;
- if(now.cap > now.flow && d[v] > d[u] + now.cost) {
- d[v] = d[u] + now.cost;
- fa[v] = i;
- cur[v] = min(cur[u], now.cap - now.flow);
- if(!inq[v]) {q.push(v); inq[v] = true;}
- }
- }
- }
- if(d[t] == INF) return false;
- flow += cur[t];
- cost += 1LL*d[t]*cur[t];
- for(int u = t; u != s; u = edges[fa[u]].u) {
- edges[fa[u]].flow += cur[t];
- edges[fa[u]^].flow -= cur[t];
- }
- return true;
- }
- int MincostMaxflow(int s, int t, LL &cost) {
- cost = ;
- int flow = ;
- while(spfa(s, t, flow, cost));
- return flow;
- }
- void run_case() {
- init();
- LL l, r, y1, y2;
- int k, xcnt = ;
- cin >> n >> k;
- for(int i = ; i <= n; ++i) {
- cin >> l >> y1 >> r >> y2;
- LL tmp = 1LL*floor(sqrt(sqr(r-l)+sqr(y2-y1)));
- if(l > r) swap(l, r);
- l <<= , r <<= ;
- if(l == r) r|=; else l|=;
- allx[++xcnt] = l, allx[++xcnt] = r, point[i] = Points{l, r, tmp};
- }
- sort(allx+,allx++xcnt);
- int len = unique(allx+,allx++xcnt)-allx;
- for(int i = ; i <= n; ++i) {
- point[i].l = lower_bound(allx+,allx+len,point[i].l)-allx;
- point[i].r = lower_bound(allx+,allx+len,point[i].r)-allx;
- }
- for(int i = ; i < len-; ++i)
- addedge(i, i+, INF, );
- int s = , t = len;
- for(int i = ; i <= n; ++i) {
- addedge(point[i].l, point[i].r, , -point[i].len);
- }
- addedge(s, , k, ), addedge(len-, t, k, );
- LL cost = ;
- n = len;
- MincostMaxflow(s, t, cost);
- cout << -cost;
- }
- int main() {
- ios::sync_with_stdio(false), cin.tie();
- run_case();
- cout.flush();
- return ;
- }
luogu P3357 最长k可重线段集问题的更多相关文章
- P3357 最长k可重线段集问题 网络流
P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...
- 洛谷P3357 最长k可重线段集问题(费用流)
传送门 其实和最长k可重区间集问题差不多诶…… 把这条开线段给压成x轴上的一条线段,然后按上面说的那种方法做即可 然而有一个坑点是线段可以垂直于x轴,然后一压变成一个点,连上正权环,求最长路……然后s ...
- 洛谷P3357 最长k可重线段集问题(费用流)
题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II ,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\subseteq IS⊆I ,使得在 ...
- 洛谷 P3357 最长k可重线段集问题【最大流】
pre:http://www.cnblogs.com/lokiii/p/8435499.html 和最长k可重区间集问题差不多,也就是价值的计算方法不一样,但是注意这里可能会有x0==x1的情况也就是 ...
- 网络流24题-最长k可重线段集问题
最长k可重线段集问题 时空限制1000ms / 128MB 题目描述 给定平面 x−O−y 上 n 个开线段组成的集合 I,和一个正整数 k .试设计一个算法,从开线段集合 I 中选取出开线段集合 S ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
- 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题
题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...
- [网络流24题]最长k可重线段集[题解]
最长 \(k\) 可重线段集 题目大意 给定平面 \(x-O-y\) 上 \(n\) 个开线段组成的集合 \(I\) ,和一个正整数 \(k\) .试设计一个算法,从开线段集合 \(I\) 中选取开线 ...
- (luogu P3358)最长k可重区间集问题 [TPLY]
最长k可重区间集问题 题目链接 https://www.luogu.org/problemnew/show/3358 做法 所有点向下一个点连容量为k费用为0的边 l和r连容量为1费用为区间长度的边 ...
随机推荐
- VS中使用C的一些函数报错的问题
VS建议采用带_s的函数,如scanf_s.strcpy_s,但这些并不是标准C函数. 要想继续使用此函数,需要在源文件中添加以下指令就可以避免这个错误提示: #define _CRT_SECURE_ ...
- 【SSM】Log4j 日志配置
1.log4j.properties ### 配置根 ### # log4j.rootLogger = debug,console ,fileAppender,dailyRollingFile,ROL ...
- QWidget: “Must construct a QApplication before a QWidget”
最近在做一个关于Qt的项目,在debug版本中没有任何问题,所以就想看看在Release版本下的运行情况,结果在开始运行时,出现如下图1-1所示的错误.在网上搜索答案,大多数是关于QWidget: M ...
- 《程序之美系列(套装共6册)》[美]斯宾耐立思 等 (作者) epub+mobi+azw3
<架构之美>内容包括:facebook的架构如何建立在以数据为中心的应用生态系统之上.xen的创新架构对操作系统未来的影响.kde项目的社群过程如何让软件的架构从粗略的草图成为漂亮的系统. ...
- Nginx禁止使用ip访问,只允许使用域名访问
Nginx虚拟主机配置,vhosts下面有很多域名的配置: [root@external-lb01 vhosts]# pwd/data/nginx/conf/vhosts [root@external ...
- 解决方法:Could not load file or assembly 'WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
最近使用VS2015调试ASP.NET 程序遇到了该问题: 在网上找了很多方法都不能解决,最后自己解决了,方法如下: 在project -> NuGet管理中找到已安装的所有程序:将Web Op ...
- 操作系统OS,Python - 生产者消费者模型
1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题.(生产者和消费者不直接通信) 2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度. 3. 在并发编程中该模式能解决大多数 ...
- 奖学金(0)<P2007_1>
奖学金 (scholar.pas/c/cpp) [问题描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分 ...
- Vacuum Pump Manufacturer - Vacuum Pump Range Use: Considerations
The vacuum pump is a versatile bottle that holds your lotion, shampoo and conditioner. Keep away fro ...
- Apache Shiro安全(权限框架)学习笔记一
1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法 2. AuthorizingRealm 类继承自 Authenticating ...