首页 > 其他分享 >P9562 [SDCPC2023] G-Matching 题解

P9562 [SDCPC2023] G-Matching 题解

时间:2024-02-24 17:22:07浏览次数:21  
标签:P9562 匹配 int 题解 SDCPC2023 else Edge ans 0x3f3f3f3f

题目描述

给定长度为 \(n\) 的整数序列 \(a_1, a_2, \cdots, a_n\),我们将从该序列中构造出一张无向图 \(G\)。具体来说,对于所有 \(1 \le i < j \le n\),若 \(i - j = a_i - a_j\),则 \(G\) 中将存在一条连接节点 \(i\) 与 \(j\) 的无向边,其边权为 \((a_i + a_j)\)。

求 \(G\) 的一个匹配,使得该匹配中所有边的边权之和最大,并输出最大边权之和。

请回忆:无向图的匹配,指的是从该无向图中选出一些边,使得任意两条边都没有公共的节点。特别地,不选任何边也是一个匹配。

思路

首先我们看到题目中的一句话:

若 \(i - j = a_i - a_j\),则 \(G\) 中将存在一条连接节点 \(i\) 与 \(j\) 的无向边

我们把这个式子两边同时加上 \(j\),减去 \(a_i\),可以得到如下的式子:

\[i - a_i = j - a_j \]

因此我们可以把原数组转换一下,第 \(i\) 项 \(a_i\) 变成 \(i - a_i\),所有处理后值相同的点之间都会有一条边,形成一个完全图,我们可以把这些点全部塞进一个 map 中。

map<int,vector<int> >Edge;

for(int i=1;i<=n;i++){
    scanf("%lld",&a[i]);
    Edge[a[i]-i].push_back(a[i]);
}

然后开始分别处理每一个完全子图。由于要我们求无向图的匹配,一个点不会被选超过两次,所以我们可以把所有点按照点权从大到小排序,每一次选择一对点,判断这两个点的和是否为正数,如果是,那么就一定选,否则直接 break 即可。

for(auto it:Edge){
    vector<int>E=it.second;
    sort(begin(E),end(E),[](int a,int b){return a>b;});
    int a=0x3f3f3f3f,b=0x3f3f3f3f;
    for(auto it:E){
        if(a==0x3f3f3f3f){
            a=it;
        }else{
            b=it;
            if(a+b>0) ans+=a+b,a=b=0x3f3f3f3f;
            else      break;
        }
    }
}

完整 Code

#include <bits/stdc++.h>
#define int long long
using namespace std;

map<int,vector<int> >Edge;
int T,n,a[500005],ans;

signed main()
{
    scanf("%lld",&T);
    while(T--){
        Edge.clear();ans=0;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            Edge[a[i]-i].push_back(a[i]);
        }
        for(auto it:Edge){
            vector<int>E=it.second;
            sort(begin(E),end(E),[](int a,int b){return a>b;});
            int a=0x3f3f3f3f,b=0x3f3f3f3f;
            for(auto it:E){
                if(a==0x3f3f3f3f){
                    a=it;
                }else{
                    b=it;
                    if(a+b>0) ans+=a+b,a=b=0x3f3f3f3f;
                    else      break;
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

标签:P9562,匹配,int,题解,SDCPC2023,else,Edge,ans,0x3f3f3f3f
From: https://www.cnblogs.com/Sundar-2022/p/18031333

相关文章

  • CF1832B Maximum Sum 题解
    【题目描述】给定一个长度为\(n\)的数列,其中每个元素互不相同,进行\(k\)次操作,每次可以选择删除序列中最小的两个数或最大的一个数。求操作后剩余数的和的最大值。【思路】我们构造一组数据:首先我们看到题目中的一句话:每次可以选择删除序列中最小的两个数或最大的一个数。......
  • P4569 [BJWC2011] 禁忌 题解
    题目传送门前置知识AC自动机|矩阵加速递推解法对于一段固定的文本串,由于重叠的模式串不对伤害产生贡献,故考虑贪心,每碰到出现一个模式串将其分为一段,最终这个文本串的伤害就是划分次数。类似luoguP3193[HNOI2008]GT考试,令\(f_{i,j}\)表示前\(i\)个字符,当前运行到......
  • AT_abc341_g [ABC341G] Highest Ratio 题解
    题目传送门前置知识单调栈简化题意给定一个长度为\(n\)的序列\(a\)。对于所有的\(l(1\lel\len)\),均求出\(\max\limits_{r=l}^{n}\{\frac{\sum\limits_{i=l}^{r}a_{i}}{r-l+1}\}\)。解法令\(sum_{i}=\sum\limits_{j=1}^{i}a_{j},P_{i}=(i,sum_{i})\),则有\(\beg......
  • P10139 [USACO24JAN] Nap Sort G 题解
    DescriptionBessie正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共\(N\)(\(1\leN\le2\cdot10^5\))个整数\(a_1,a_2,\ldots,a_N\)(\(1\lea_i\le10^{11}\)),她将会按排序顺序将这些数放入一个单独的数组中。她反复查找这堆数中的最小数,将其删除,同时将其添加到......
  • UOJ228/HDU5828 基础数据结构练习题/Rikka with Sequence 题解(势能线段树)
    势能线段树。如果线段树上一个节点的\(\max-\min\ge2\),我们称其为关键节点,考虑定义势能\(\phi\)为线段树上关键节点的个数。对于每次开方操作,如果当前节点为关键节点,则暴力递归左右儿子修改,否则:如果当前节点\(\max=\min\)或\(\max=\min+1\)且\(\max\)不是完全平方数,......
  • UVA12421 (Jiandan) Mua (I) - Lexical Analyzer 题解
    蒟蒻的第一篇紫题题解!题目传送门思路一眼模拟,还是大模拟。不由得想起了我编了\(4\)个小时的猪国杀……输入首先处理输入,这里我们用一个字符串数组来存储所有的输入,然后再进行处理。while(getline(cin,sr))str[++cnt]=sr+'\n';处理时需要双重循环,注意如果遍历到空格要跳......
  • CF916E Jamie and Tree 题解
    题目链接:CF或者洛谷本题难点在于换根LCA与换根以后的子树范围寻找,重点讲解先说操作一,假如原根为\(1\)变为了\(x\),又变为了\(y\),那么其实\(y\)和\(x\)都可以看做由\(1\)变化而来的,即\(1\rightarrowx\)与\(1\rightarrowy\),原因很简单,我们可以把\(1\rightar......
  • P9901 『PG2』弯曲半平面直线同向图最大流 题解
    思路正解想不出,只好用网络流了网络流简介请戳这儿。这道题数据有点大用EK求最大流似乎过不了,所以本蒟蒻采用Dinic算法。Dinic算法Dinic算法相当于EK的优化。在原基础找增广路的基础上添加了一个分层操作,再通过深搜找阻塞流。分层从原点开始我们把可以通过一步到达的......
  • 记录pyinstaller 打包 pdfplumber 问题解决过程
    今天有一个pdf文件处理需求,使用pdfplumber库完成,python环境是3.11+win10pyinstaller5.10.1打包完成后,工具可以顺利打开,但是执行处理的时候报错File"pypdfium2_raw\bindings.py",line93,in<module>File"pypdfium2_raw\bindings.py",line83,in_register_library......
  • blazor 问题解决
    Cannotprovideavalueforproperty'ScrollToLocationHash'ontype'Microsoft.AspNetCore.Components.Routing.Router'.Thereisnoregisteredserviceoftype'Microsoft.AspNetCore.Components.Routing.IScrollToLocationHash'.异常信息......