洛谷2619/bzoj2654 Tree(凸优化+MST)
bzoj的数据是真的水。。
qwq
由于本人还有很多东西不是很理解
qwq
所以这里只写一个正确的做法。
首先,我们会发现,对于你选择白色边的数目,随着数目的上涨,斜率是单调升高的。
那么这时候我们就可以考虑凸优化,也就是\(wqs\)二分来满足题目中所述的正好\(k\)条边的限制。
我们\(erf\)一个\(mid\),然后让每一个白边的权值都加上\(mid\),然后跑\(MST\),看最后的选的白色边数,是否是大于等于\(k\)的,如果是,就调大\(l\),否则调小\(r\)。
由于最小生成树选择边的时候可能有一些玄学的错误,所以我们在\(sort\)的时候,对于权值相等的边,我们优先选择白边。
那么通过\(erf\),之后,我们就能得到一个上界,也就是在当前的偏移量下,我们最多的选和1相连的边的个数。
根据\(clj\)的官方题解,这里有两个引理
对于一个图,如果存在一个最小生成树,它的白边的数量是\(x\),那么就称\(x\)是最小合法白边数。所有的最小合法白边数形成一个区间\([l,r]\)
(因为题目保证有解,所以我们只需要找到最小的\(r\)即可)
那么经过这个\(erf\),我们就能得到一个最小的\(r\)
那么我们应该怎么求整个\(MST\)的权值呢,我们会发现,对于权值相等的白边和黑边,由于题目保证有解,所以一定是会存在相互替代的关系的。
那我们可以按照之前的最小生成树的策略选白边,将其记为\(val\),最后输出\(val-k*ans\),\(ans\)表示最后的\(mid\)。
为什么是\(k\)而不是具体的选的边的数目呢?
因为题目要求正好选择\(k\)条,而我们这里实际上是把多余的白边都直接视为黑边来做了
qwqwq
那么这个题就能解决了
qwqwqwqwq
但是我根据CF125E那个题,有一个比较特殊的做法,但是套到这个这个题,我并不是很理解。qwq
这个坑还是之后再填吧
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<vector>
#define mk make_pair
#define pb push_back
#define ll long long
#define int long long
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
const int maxn = 4e5+1e2;
struct Edge{int u,v,w;int col;
};
Edge e[maxn];
int n,m;
int ans;
int l=-200,r=200;
int fa[maxn];
int find(int x)
{if (fa[x]!=x) fa[x]=find(fa[x]);return fa[x];
}
int k;
bool cmp(Edge a,Edge b)
{if (a.w==b.w) return a.col<b.col;return a.w<b.w;
}
int solve()
{sort(e+1,e+1+m,cmp);int tot=0;for (int i=1;i<=m;i++){int f1 = find(e[i].u);int f2 = find(e[i].v);if (f1==f2) continue;//if(tot==k && e[i].col==0) continue;if (e[i].col==0) ++tot;fa[f1]=fa[f2];}return tot;
}
signed main()
{n=read(),m=read();k=read();for (int i=1;i<=m;i++){e[i].u=read()+1;e[i].v=read()+1;e[i].w=read();e[i].col=read();}while(l<=r){int mid = (l+r) >> 1;for (int i=1;i<=n;i++) fa[i]=i;for (int i=1;i<=m;i++){if (e[i].col==0) e[i].w+=mid; }int tmp = solve();if (tmp<k){r=mid-1;}else l=mid+1,ans=mid;for (int i=1;i<=m;i++) {if (e[i].col==0) e[i].w-=mid;}}for (int i=1;i<=n;i++) fa[i]=i;for (int i=1;i<=m;i++)if (e[i].col==0) e[i].w+=ans;sort(e+1,e+1+m,cmp);int tot=0,val=0;for (int i=1;i<=m;i++){int f1 = find(e[i].u);int f2 = find(e[i].v);if (f1==f2) continue;if (e[i].col==0) ++tot;fa[f1]=fa[f2];val+=e[i].w;}cout<<val-k*ans;return 0;
}
转载于:https://www.cnblogs.com/yimmortal/p/10202290.html
洛谷2619/bzoj2654 Tree(凸优化+MST)相关推荐
- CF125E MST company (凸优化+MST)
qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...
- 高时空损耗的Scanner会卡爆程序(记洛谷P1567的Java性能优化,Java语言描述)
写在前面 对性能调优,其实我一个弱鸡,用的也不多,特别是这种OJ连JVM调优都不成. 大佬s勿喷,且看小菜鸡如何在一道OJ题里与Java性能搏斗! 题目要求 P1567题目链接 简单分析 10^9,没 ...
- 洛谷 P2163 [SHOI2007]Tree 园丁的烦恼
此题树状数组卡常好题(滑稽) 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他 ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)
题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...
- 洛谷P2619 [国家集训队]Tree I 题解
洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...
- 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)
洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )
昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...
最新文章
- 中文的csv文件python读取编码问题
- xen挂载虚拟机分区删除日志 破解密码无所不能
- 高斯白噪声下基于EM的多径时延估计
- MATLAB上的GPU加速计算——学习笔记
- 曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家
- MVC源码解析 - 配置注册 / 动态注册 HttpModule
- 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
- java的ArrayList分析
- Matlab之函数绘图函数ezplot
- 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能对话机器人
- 【JAVA】IOStream
- javascript毫秒计时器_JavaScript原生秒表、计时器
- 美赛 5:评价类模型、插值与拟合模型(十大模型篇)
- OPNsense用户手册-高可用性和硬件故障转移
- 容器化部署之看板工具: Wekan
- es中的keyword相关功能
- su联合推拉使用方法_12个最实用的SU建模技巧
- UDS(一)入门概述
- 随机打乱数据的几种方式
- 邱锡鹏 神经网络与深度学习课程【十六】——深度信念网络
热门文章
- isinstance和issubclass
- 遍历List过程中同时修改
- [转载]Oracle ltrim() 函数用法
- 常州模拟赛d4t1 立方体
- Tomcat的详解和优化
- Linux crontab命令
- activity直接销毁_Android -- Activity的销毁和重建
- Dijkstra 计算两地间的最短距离
- Python安装pyinstaller模块的错误:NO module name “setuptools“
- MySQl Got a packet bigger than ' max_allowed_packet' bytes