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

题目链接:P2619 [国家集训队]Tree I

题意

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有 need\text{need}need 条白色边的生成树。

题目保证有解。

对于 100%100\%100% 的数据,n≤5×104,m≤105n\leq 5\times10^4,m\leq 10^5n≤5×104,m≤105。

所有数据边权为 [1,100][1,100][1,100] 中的正整数。

直接 O(nm)O(nm)O(nm) 的dp肯定是不行的,考虑wqs二分。

在这题中,wqs二分做的其实就是给白边增加额外权值

使最优方案恰好选满 need\text{need}need 条白边 。

假设二分的权值为 mid\text{mid}mid ,

若选了大于 need\text{need}need 条白边,则将白边边权增大,反之同理。

具体的,设选 xxx 条白边的最小花费 f(x)f(x)f(x)

注意到点集 (x,f(x))(x,f(x))(x,f(x)) 形成一个下凸壳

也就是 f(x)f(x)f(x) 为一个整数域的下凸函数

我们二分一个斜率 kkk ,用这条直线去尝试切凸壳

显然这条直线在不确定 yyy 轴截距时可以与这个凸壳有很多交点,

由斜截式方程得 yyy 轴截距公式为
b=y−kxb=y-kx b=y−kx
代入得
b(x)=f(x)−kxb(x)=f(x)-kx b(x)=f(x)−kx
而 b(x)b(x)b(x) 就是所有白边的边权减去 kkk 以后选 xxx 条白边的最小花费(最小生成树)

然后不考虑 xxx 的限制跑一遍kruskal求出一个修改后的最优解,

根据这个最优解(也就是最小的 b(x)b(x)b(x) )对应的 xxx 改变左右端点

因为边权在 [1,100][1,100][1,100] 间,所以设个 l=−111,r=111l=-111,r=111l=−111,r=111 即可

时间复杂度 O(nlog⁡nlog⁡222)O(n\log n\log 222)O(nlognlog222)

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(1e5+15)struct Edge
{int u,v,w,c;
}e[N];
int n,m,need,cnt,sum,u[N],v[N],w[N],c[N],f[N];
void init(){for(int i=1; i<=n; i++) f[i]=i;}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void merge(int u,int v){f[find(u)]=find(v);}
void kruskal(int mid)
{cnt=sum=0;  init();for(int i=1; i<=m; i++)if(c[i])e[i]={u[i],v[i],w[i],c[i]};else e[i]={u[i],v[i],w[i]-mid,c[i]};sort(e+1,e+1+m,[](Edge a,Edge b){return a.w==b.w?a.c<b.c:a.w<b.w;});int tmp=0;for(int i=1; i<=m&&tmp<n; i++){if(find(e[i].u)!=find(e[i].v)){merge(e[i].u,e[i].v);++tmp; cnt+=(e[i].c^1);sum+=e[i].w;}}
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// freopen("check.in","r",stdin);// freopen("check.out","w",stdout);cin >> n >> m >> need;for(int i=1; i<=m; i++){cin >> u[i] >> v[i] >> w[i] >> c[i];u[i]++; v[i]++;}int l=-111,r=111,ans=0;while(l<r){int mid=(l+r)>>1;kruskal(mid);if(cnt>=need){r=mid;ans=sum+need*mid;}else l=mid+1;}cout << ans << '\n';return 0;
}

转载请说明出处

洛谷P2619 [国家集训队]Tree I 题解相关推荐

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

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

  2. P2619 [国家集训队]Tree I(WQS二分/带权二分/最小生成树)

    P2619 [国家集训队]Tree I 给定一个n个点,m条边的无向图,每条边有一个颜色黑色或者白色,求解恰好有k条白色边的最小生成树. 那么看到恰好选择k个的最优性问题,我们可以利用WQS二分解决, ...

  3. 洛谷:P2619 [国家集训队]Tree I(最小生成树、二分加权)

    国家集训队是不一样 题意: 很清晰不赘述 思路: 没写过应该想不到. 可以证明给所有白边枚举加权,一定有一种权值情况可以满足恰好 need 条白边,同时是最小生成树. 观察可以发现具有二分性,二分的不 ...

  4. 洛谷P1494 [国家集训队]小Z的袜子

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- ...

  5. 洛谷P2839 [国家集训队]middle(主席树)

    P2839 [国家集训队]middle 我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 mid ...

  6. 洛谷 P4643 [国家集训队]阿狸和桃子的游戏

    题目:[国家集训队]阿狸和桃子的游戏 思路: 截个图,这个思路太巨了Orz. 图可以点.

  7. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  8. [洛谷P1407][国家集训队]稳定婚姻

    题目大意:有$n$对夫妻和$m$对情人,如果一对情人中的两人都离婚了,那么他们可以结为夫妻.对于每一对夫妻,若他们离婚后所有人依然可以结婚,那么就是不安全的,否则是安全的.问每一对夫妻是否安全. 题解 ...

  9. 洛谷P2634 [国家集训队]聪聪可可(点分治)

    聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了 ...

最新文章

  1. GLFW--Getting started
  2. RSA加密传输代码示例
  3. Classifying dynamic textures via spatiotemporal fractal analysis(许教授)
  4. GDCM:gdcm::Dumper的测试程序
  5. mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)
  6. vs2013 c# 中调用 c 编写的dll出错的可能错误
  7. vue.js:634 [Vue warn]: Error in render: “TypeError: Cannot read property ‘matched‘ of undefined“
  8. sqlalchemy like
  9. (转) C# Async与Await的使用
  10. BI工具那么多 该如何选择
  11. cox回归模型python实现_cox回归模型python实现_生存分析Cox回归模型(比例风险模型)的spss操作实例...
  12. 查看进程的发起程序linux,Linux挂载iSCSI设备
  13. Tara's Beautiful Permutations 组合数学
  14. 开调查公司创业,他的公司营业额达80万
  15. 定常系统(时不变系统)和时变系统
  16. FI-盘盈盘亏借贷科目
  17. OpenLayers3基础教程——OL3 介绍control
  18. 搭建Snipeit资产管理系统
  19. “灵”是我的眼 | 扫地机器人的智能化进阶之路
  20. 星起航:抖音小店适合去做吗

热门文章

  1. 【基础逻辑】对位乘法与升多项式子项根号——柯西不等式
  2. JavaSE阶段笔记
  3. 【WLAN】【测试】WLAN相关测试软件一览
  4. 采购人员应该考什么证书?
  5. 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。矩阵相乘的基本方法是:矩阵A的第i行的所有元素同矩阵B第j列的所有元素对应相乘,并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。
  6. c++课程设计自助点餐系统
  7. 《中国合伙人》:致我们即将逝去的青春
  8. stdin, stdout, stderr
  9. 集合 - Java篇
  10. python模拟ios_使用Xcode + Python进行IOS运动轨迹模拟!