首页 > 其他分享 >abc065d <贪心+最小生成树> [lambda表达式]

abc065d <贪心+最小生成树> [lambda表达式]

时间:2023-07-10 09:25:22浏览次数:61  
标签:return pt int fa edge abc065d find 表达式 lambda

D - Built?

// https://atcoder.jp/contests/abc065/tasks/arc076_b
// 贪心+最小生成树
// 关键在于意识到, 连接x或y相邻的边代价最小, 因而无需考虑全部的边, 仅需考虑这些相邻边即可(贪心)
// 学习:
//  1. lambda写法  https://www.cnblogs.com/yaya12138/p/11815475.html
//  2. unit() 的代码风格 
//  3. x[], y[] 代码风格 
//  4. 对索引pt[]sort的代码风格
//  5. 要习惯定义结构体, 这样更方便
// 参考 https://www.bilibili.com/read/cv24439598
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;

struct Edge
{
    int u, v, w;
};

int x[N], y[N];  // 第i个输入的x和y
int pt[N];  // 索引
int fa[N];  // 并查集

int find(int x)
{
    return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}

void solv()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> x[i] >> y[i];
        fa[i] = pt[i] = i;
    }

    vector<Edge> edge;
    // 按x排序, 达到x方向的相邻边, 计算权重, 记录
    sort(pt+1, pt+1+n, [&](int &a, int &b) {return x[a] < x[b]; });
    for (int i = 1; i < n; i ++) edge.push_back({pt[i], pt[i+1], abs(x[pt[i]] - x[pt[i+1]])});
    // y
    sort(pt+1, pt+1+n, [&](int &a, int &b) {return y[a] < y[b]; });
    for (int i = 1; i < n; i ++) edge.push_back({pt[i], pt[i+1], abs(y[pt[i]] - y[pt[i+1]])});
    
    // Kruskal
    sort(edge.begin(), edge.end(), [&] (Edge &a, Edge &b) {return a.w < b.w; });
    LL ans = 0;
    for (auto &e: edge)
    {
        int a = find(e.u), b = find(e.v);
        if (a != b)
        {
            fa[a] = b;
            ans += e.w;
        }
    }
    cout << ans << endl;
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T --)
    {
        solv();
    }
    return 0;
}

标签:return,pt,int,fa,edge,abc065d,find,表达式,lambda
From: https://www.cnblogs.com/o2iginal/p/17538510.html

相关文章

  • 匿名函数(lambda表达式)01
    匿名函数顾名思义就是没有名字的函数。匿名函数是一种没有函数名的函数,也称为"lambda函数"。它是一种简洁的函数定义方式,可以在需要函数对象的任何地方使用,并且通常用于简化代码或作为其他函数的参数。语法1lambdaarguments:expression其中,arguments是函数的参数列表,而......
  • 查找多个字符串的正则表达式
    非元组捕获的语法为:(?:exp) 比如查找江浙沪包邮区:(?:浙江|上海|江苏) 元组的概念(待补充)Python中的元组Python中元组(Tuple)是一种特殊的列表,是Python中可以用于存储数据集合数据类型。它的特殊性是:元组是一个是有序的且不可改变的集合......
  • 再见正则表达式!这次彻底告别手写!
    篇文章的目的是让你能得到完美的正则表达式,而且还不用自己拼。说到正则表达式,一直是令我头疼的问题,这家伙一般时候用不到,等用到的时候发现它的规则是一点儿也记不住,\d表示一个数字,\s表示包括下划线在内的任意单词字符,也就是 [A-Za-z0-9_],还有[\s\S]*可以匹配包括换行在内的任意......
  • 正则表达式中的\w
    在正则表达式中,\w 表示字母数字字符(Wordcharacter)。它匹配任何字母(包括大写和小写字母)和数字字符。具体而言,\w 匹配以下字符:所有字母(a-z、A-Z)和数字(0-9)的字符。下划线 _。以下是一些 \w 可能匹配的示例:字母(小写和大写),如 a、b、A、B 等数字,如 0、1、2 等下划线......
  • 正则表达式学习
    正则表达式学习正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。普通字符普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和......
  • 正则表达式学习
    正则表达式学习语法正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。普通字符普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有......
  • 正则表达式学习
    #正则表达式学习##语法>正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。##普通字符>普通字符包括没有显式指定为元字符的所有可打印和不可打印字符......
  • 正则表达式学习
    #正则表达式学习##语法>正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。##普通字符>普通字符包括没有显式指定为元字符的所有可打印和不可打印字符......
  • java双冒号写法(Lambda的简写)
    类似这种Person::getName,双冒号写法,是Java8对Lambda表达式的简写常见的简写场景有以下是Java8中方法引用的一些语法:静态方法引用(staticmethod)语法:classname::methodname例如:Person::getAge对象的实例方法引用语法:instance::methodname例如:System.out::println对象的超类方......
  • 让python的lxml模块的xpath支持正则表达式
    python的lxml模块是处理xml文档的比较好用的工具,其中的xpath函数可以检索指定的元素,但是它不支持正则表达式,比如某个属性的值是否匹配某个正则表达式,就没有办法实现.不过可以利用它的自定义函数扩展功能来实现,如下代码所示:importrefromlxmlimportetreefromlxm......