P2619 [国家集训队]Tree I(wqs二分)

wqs是一个大佬,wqs二分是基于 凸包型的问题,斜率的二分。

本题设(x,g(x))(x,g(x))(x,g(x)) 表示恰好选择xxx条白边,对应最小MST的权值和g(x)g(x)g(x)。

可以用平方的dp 证明该函数形状是个下凸的。

然后就可以上wqs二分了。

我们二分增量,也就是直线的斜率,在本题就是所有白边权值的增量。

然后用Kruskal找到最优值ansansans,显然我们可以同时求出对应的白边的数量x′x'x′。

如果x′≥needx'\ge needx′≥need ,则说明二分的斜率midmidmid 偏小,l=mid+1l=mid+1l=mid+1,然后更新res=ans−mid×needres =ans-mid\times needres=ans−mid×need。这里是还原mid对应的影响。

最后的resresres就是答案了。

时间复杂度:O(mlogm×logW)O(mlogm\times logW)O(mlogm×logW)

// Problem: P2619 [国家集训队]Tree I
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2619
// Memory Limit: 500 MB
// Time Limit: 2000 ms
// Date: 2022-04-11 21:33:52
// --------by Herio--------#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=5e4+5,M=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
template <typename T>     //x=max(x,y)  x=min(x,y)
void cmx(T &x,T y){if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){if(x>y) x=y;
}
struct Kruskal{#define il inline   struct edge{int u,v,w,o;bool operator<(const edge &e)const{return w==e.w?o<e.o:w<e.w;}}e[M];int s[N];il int find(int x){return s[x]==x?x:s[x]=find(s[x]);}int n,m,need;il void init(){scanf("%d%d%d",&n,&m,&need);rep(i,1,m){int u,v,w,o;scanf("%d%d%d%d",&u,&v,&w,&o);u++,v++;e[i] = {u,v,w,o};}int l = -100,r = 100;ll res  = 0,ans = 0;int cnt = 0;//printf("n=%d m=%d\n",n,m);while(l<=r){int mid = l+r>>1;rep(i,1,m){if(!e[i].o) e[i].w+=mid;}solve(cnt,ans);//printf("cnt=%d\n",cnt);if(cnt>=need) res = ans-need*mid, l = mid+1;else r = mid-1;rep(i,1,m){if(!e[i].o) e[i].w-=mid;}}printf("%lld\n",res);}il void solve(int &cnt,ll &ans){sort(e+1,e+m+1);rep(i,1,n) s[i] = i;cnt = 0;ans = 0;int cc = 0;rep(i,1,m){int u = e[i].u, v = e[i].v, w = e[i].w;u=find(u),v=find(v);if(u!=v){ans += w;s[u] = v;cc++;if(!e[i].o) cnt++;}if(cc == n - 1) {return;}}}
}T;
int main(){T.init();return 0;
}

关于WQS二分可以参考下面的文章。

传送门

题解区

P2619 [国家集训队]Tree I(wqs二分)相关推荐

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

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

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

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

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

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

  4. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  5. P2619 [国家集训队2]Tree I

    P2619 [国家集训队2]Tree I 链接 分析: 为了确定白边选入的数量,所以给白边加一个权值,二分这个值,然后最小生成树.可以发现白边的数量虽这个值的增大而减小,满足单调性. 有一个问题:如果 ...

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

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

  7. Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分

    新学的科技.设\(f(x)\)为选\(x\)条白色边的时候的最小生成树权值和,那么可以猜到它应该是一个下凸函数的形式. 如图,图中\(x\)坐标表示选的白色边条数,\(y\)坐标表示获得的权值,那么我 ...

  8. BZOJ2654/COGS1764 [2012国家集训队]tree(陈立杰) [生成树,二分]

    BZOJ传送门,COGS传送门 tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V, ...

  9. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

  10. P1527 [国家集训队]矩阵乘法 整体二分 + 二维树状数组

    传送门 题意: 思路: 算是个整体二分的板子啦,不过这个是二维的矩阵,我们只需要把一位树状数组改成二维的,让后动态维护单点加,区间查询前缀和即可. //#pragma GCC optimize(2) ...

最新文章

  1. xmarin.android导航栏,android – 如何在xamarin表单中更改导航页面后退按钮
  2. halcon车牌识别完整源码_基于chineseocr_lite的身份证、火车票、车牌等中文OCR文字识别...
  3. 计算机启动操作系统的过程,操作系统启动过程
  4. 你在看Netflix,Netflix也在看你
  5. 如何让快递更快?菜鸟自研定时任务调度引擎首次公开
  6. SpringAMQP--消息转换器
  7. JS疑惑-1(连续赋值)
  8. 某计算机公司的库存管理,《管理系统中计算机应用》应用题数据流程图汇总题及参考答案...
  9. request.post
  10. 黄聪:详解 ManualResetEvent(转)
  11. 还不知道如何使用 IDEA ?教你三招快速掌握 IDEA
  12. 基于微信小程序外卖点餐系统 开题报告
  13. 对WORD文档的关键字搜索
  14. arcgis 视频教程 ArcGIS Pro 从0到1
  15. 格物斯坦:机器人高手决战申城,IRM开启孩子新视界
  16. 手机话费充值api接口 话费充值功能接入
  17. NSIS 头文件介绍_TextFunc.nsh(2)
  18. 项目总结“遇见江小丽”
  19. 力扣(LeetCode)159. 至多包含两个不同字符的最长子串(2022.06.08)
  20. 硬纪元干货|appMagics伏英娜:优质IP和直播内容嫁接,带来全新AR体验

热门文章

  1. 二级计算机中一级标题设置,如何编辑目录中一级标题二级标题的不同格式
  2. Java实现 pdf 转 图片
  3. (35)pycharm在debug模式下一直显示collecting data
  4. vue中打印多一页空白页
  5. Axure RP小部件使用教程
  6. 摄氏温度和华氏温度相互转换(及其概念)
  7. SVProgressHUD 的显示时间
  8. 完美简单的集成高德地图导航和语音播报功能
  9. vba字典重复key_VBA字典技术整理
  10. http(S)系列之(五):android之HttpURLConnection源码解析(1)