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)相关推荐

  1. CF125E MST company (凸优化+MST)

    qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...

  2. 高时空损耗的Scanner会卡爆程序(记洛谷P1567的Java性能优化,Java语言描述)

    写在前面 对性能调优,其实我一个弱鸡,用的也不多,特别是这种OJ连JVM调优都不成. 大佬s勿喷,且看小菜鸡如何在一道OJ题里与Java性能搏斗! 题目要求 P1567题目链接 简单分析 10^9,没 ...

  3. 洛谷 P2163 [SHOI2007]Tree 园丁的烦恼

    此题树状数组卡常好题(滑稽) 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他 ...

  4. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

  5. 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)

    题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...

  6. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  7. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...

  8. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  9. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

最新文章

  1. 中文的csv文件python读取编码问题
  2. xen挂载虚拟机分区删除日志 破解密码无所不能
  3. 高斯白噪声下基于EM的多径时延估计
  4. MATLAB上的GPU加速计算——学习笔记
  5. 曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家
  6. MVC源码解析 - 配置注册 / 动态注册 HttpModule
  7. 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
  8. java的ArrayList分析
  9. Matlab之函数绘图函数ezplot
  10. 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能对话机器人
  11. 【JAVA】IOStream
  12. javascript毫秒计时器_JavaScript原生秒表、计时器
  13. 美赛 5:评价类模型、插值与拟合模型(十大模型篇)
  14. OPNsense用户手册-高可用性和硬件故障转移
  15. 容器化部署之看板工具: Wekan
  16. es中的keyword相关功能
  17. su联合推拉使用方法_12个最实用的SU建模技巧
  18. UDS(一)入门概述
  19. 随机打乱数据的几种方式
  20. 邱锡鹏 神经网络与深度学习课程【十六】——深度信念网络

热门文章

  1. isinstance和issubclass
  2. 遍历List过程中同时修改
  3. [转载]Oracle ltrim() 函数用法
  4. 常州模拟赛d4t1 立方体
  5. Tomcat的详解和优化
  6. Linux crontab命令
  7. activity直接销毁_Android -- Activity的销毁和重建
  8. Dijkstra 计算两地间的最短距离
  9. Python安装pyinstaller模块的错误:NO module name “setuptools“
  10. MySQl Got a packet bigger than ' max_allowed_packet' bytes