首页 > 其他分享 >一般图最小匹配 题解

一般图最小匹配 题解

时间:2024-02-01 16:23:38浏览次数:30  
标签:node 匹配 val int 题解 最小 long 最小值 define

image

image

image

首先进行排序,显然只有排序后相邻两个元素匹配才有可能成为答案。

我们设 \(b_i=a_i-a_{i-1}\),则问题转化为:在 \(b\) 数组中选 \(m\) 个数(显然一个 \(b\)),两两不能相邻,求这些数和最小值。

就和这道题一模一样了,使用反悔贪心。

具体的,我们可以将所有 \(b_i\) 放进小根堆里,每次取出最小值,用链表维护这个点前面和后面没有被删或取出的点,记为 \(l\) 和 \(r\)。

然后我们可以将 \(b_l+b_r-b_x\) 推进堆里,然后删除 \(l\) 和 \(r\)。这是因为当 \(b_l+b_r\) 更优时,如果取了 \(b_x\) 后 \(b_l+b_r-b_x\) 为下一个最小值,那么答案累计的就是 \((b_l+b_r-b_x)+b_x\),也就是 \(b_l+b_r\),这样就保证了正确性。

code:

点击查看代码
#include<bits/stdc++.h>
 #define ull unsigned long long
 #define ll long long
 #define int long long
 #define vi vector<int>
 #define pb push_back
 #define imp map<int,int>
 #define debug printf("debug\n")
 using namespace std;
 const int N=100005;
 int n,m,a[N],b[N],pre[N],nxt[N],ans=0,vis[N];
 struct node{
    int x,val;
    friend bool operator < (node A,node B){
        return A.val>B.val;
    }
 };
 priority_queue<node>pq;
 signed main(){ 
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    sort(a+1,a+n+1);
    for(int i=1;i<n;i++){
        b[i]=a[i+1]-a[i];
    }
    for(int i=1;i<n;i++){
        // printf("%lld ",b[i]);
        pre[i]=i-1;
        nxt[i]=i+1;
        pq.push((node){i,b[i]});
    }
    // printf("\n");
    pre[1]=n-1;
    nxt[n-1]=1;
    // while(!pq.empty()){
    //     printf("%lld ",pq.top().val);
    //     pq.pop();
    // }
    while(m--){
        while(vis[pq.top().x]) pq.pop();
        node top=pq.top();
        pq.pop();
        ans+=top.val;
        int x=top.x;
        vis[pre[x]]=vis[nxt[x]]=1;
        b[x]=b[pre[x]]+b[nxt[x]]-b[x];
        pre[x]=pre[pre[x]];
        nxt[x]=nxt[nxt[x]];
        nxt[pre[x]]=x;
        pre[nxt[x]]=x;
        pq.push((node){x,b[x]});
    }
    printf("%lld\n",ans);
    return 0;
 }

标签:node,匹配,val,int,题解,最小,long,最小值,define
From: https://www.cnblogs.com/victoryang-not-found/p/18001491

相关文章

  • 关于阻抗匹配的内容
    网上的截图:            ......
  • PMP-6.8 控制资源--问题解决
    一、控制资源基础内容 0.涉及领域:资源管理计划资源管理计划为如何使用、控制和最终释放实物资源提供指南。1.控制资源阶段需参照文档(1)问题日志问题日志用于识别有关缺乏资源、原材料供应延迟,或低等级原材料等问题。(2)经验教训登记册在项目早期获得的经验教训可......
  • Klocwork 2023.4发布:问题匹配算法升级,编码标准全面支持!
    Klocwork2023.4的新增功能Klocwork2023.4改进了问题匹配的算法,为桌面端和CI集成构建之间的结果提供了更大的一致性,以及连续构建之间的问题匹配。Klocwork的最新版本还改进了C/C++语言的分析引擎,减少了误报/漏报,跨过程跟踪数组索引中的值和具有常量表达式的值。此外,还对IDE插......
  • 【学习笔记】二分图匹配 匈牙利(NTR)算法
    时间复杂度显然,这个算法的时间复杂度是O(一边的点数*边数)因为最坏情况就是每一个点都要把所有的边问一遍能不能匹配显然,常数极小另外可以留意一下数据范围,因为如果是稠密图(\(n=500m=2e5\)这种)就可以考虑邻接矩阵存图,方便判重边S准备以下是跑Ntr算法要用的一些东西如果题......
  • SQL PARTITION BY 语句把一张表分组后的最大值或最小值插入另一张表里
    1.例子见前一章,目的是有分组的,只显示OrderAmount最高的(即每组只显示一列) 2.再建一个表来存储CREATETABLE[dbo].[MaxOrders]([orderid][int]NULL,[Orderdate][date]NULL,[CustomerName][varchar](100)NULL,[Customercity][varchar](100)NULL,......
  • 上下界 可行/最大/最小 网络流/费用流(有/无源汇)
    对网络的定义进行扩展,我们可以得出一堆奇奇怪怪的网络。上下界令\(Max_e\)为边\(e\)的流量上界,\(Min_e\)为边\(e\)的流量下界,一条边的流量\(f_e\)要满足\(Min_e\lef_e\leMax_e\),除此之外和普通网络流定义相同,可以发现,普通的网络就是下界为\(0\)的网络。无源汇......
  • CF1753D 题解
    因为最后要找的是“腾出空位”的最小代价。所以不妨把“障碍的移动”转化为“空位的移动”。令\(f_{x,y}\)为:使得\((x,y)\)为空,至少需要多少代价。下面来找转移方程,显然转移方程与空格子移动有关。所以观察空格子移动的规律。若当前格子\((x,y)\)为L。以\((x,y+1)\)......
  • 最小生成树
    曼哈顿距离:51nod1213|POJ3241切比雪夫距离:ARC076B欧几里得距离:P6362异或:CF888G|nowcoder920B(题面·题解)大佬博客:1|2......
  • 最小的调整次数 od
    最小调整顺序次数、特异性双端队列逻辑分析题目描述有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据.小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据......
  • XPath从入门到精通:基础和高级用法完整指南,附美团APP匹配示例
    XPath通常用来进行网站、XML(APP)和数据挖掘,通过元素和属性的方式来获取指定的节点,然后抓取需要的信息。学习XPath语法之前,首先了解一下一些概念。概念介绍节点之间的关系以上面的HTML节点树为例,节点之间包含了下列的关系:父节点(Parent):HTML是DIV和P节点的......