P9562 [SDCPC2023] G-Matching 题解
题目描述
给定长度为 \(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\) 变成 \(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 [SDCPC2023] G-Matching 题解的更多相关文章
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- [LeetCode] Wildcard Matching 题解
6. Wildcard Matching 题目 Implement wildcard pattern matching with support for '?' and '*'. '?' Matche ...
- G - Pyramid 题解(打表)
题目链接 题目大意 t组数据,给你一个n(n<=1e9)求高度为n的等边三角形,求里面包含了多少个等边三角形 题目思路 打表找规律,然而我一直没找到规律. 看到题解恍然大悟,答案就是C(n+3, ...
- Codeforces Round #744 (Div. 3) G题题解
淦,最后一道题没写出来,...还是我太菜了,不过这个题确实比较有趣. G. Minimal Coverage 简化题意:就是你处在坐标轴的0点上,给你一个序列\(a_i\),每次你可以选择向左走\(a ...
- AtCoder Beginner Contest 220部分题(G,H)题解
刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
- Infinite Fraction Path HDU 6223 2017沈阳区域赛G题题解
题意:给你一个字符串s,找到满足条件(s[i]的下一个字符是s[(i*i+1)%n])的最大字典序的长度为n的串. 思路:类似后缀数组,每次倍增来对以i开头的字符串排序,复杂度O(nlogn).代码很 ...
- SWPU-ACM集训队周赛之组队赛(3-11)G题题解
点这里去做题 水水水水水,不难发现如下表 t 1 2 3 4 v 1 3 5 7 s 1 4 9 16 明显s=t*t 题目中对10000取模即取后四位,即对1000取余 #include<st ...
- 2016 ACM-ICPC 青岛站网络赛G题 题解
[参考博客][https://blog.csdn.net/Tawn0000/article/details/82255682] 题意: 将n个数按照每k个一组来合并,合并需要花费的cost是两个数的长 ...
- 福建工程学院第十四届ACM校赛G题题解
外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ...
- O - Matching 题解(状压dp)
题目链接 题目大意 给你一个方形矩阵mp,边长为n(n<=21) 有n个男生和女生,如果\(mp[i][j]=1\) 代表第i个男生可以和第j个女生配对 问有多少种两两配对的方式,使得所有男生和 ...
随机推荐
- python删除指定文件夹下文件和文件夹的方法
前记 python删除指定文件夹下的文件,是一个常用的功能.我找了不少地方,一直没有找到合适的模版,那只好自己倒腾一个比较实用的模版了. 基本模块 这里面会用到几个模块,一个是目录下所有文件的 ...
- PAT 甲级【1013 Battle Over Cities】
本题就是dfs.连通图个数-2: 但是java慢,最后一个case 超时 import java.io.*; import java.util.HashSet; import java.util.Se ...
- .NET周刊【3月第3期 2024-03-24】
国内文章 Garnet: 力压Redis的C#高性能分布式存储数据库 https://www.cnblogs.com/InCerry/p/18083820/garnet_introduce 微软研究院 ...
- KingbaseES V8R3 运维案例 -- sys_dump备份故障“SYS_MAC_POLICY_ENFORCEMENT”
案例说明: 在KingbaseES V8R3执行sys_dump时出现"ERROR: permission denied for relation SYS_MAC_POLICY_ENFO ...
- JDBC访问KingbaseES数据库异常 -- 案例分析
应用使用jdbc访问KingbaseES数据库发生异常:SocketTimeoutException Read timed out 一.异常现象: 应用显示ERROR信息: Caused By: ja ...
- P图神器Lama下载介绍,一键移除图片中任何不想要的元素
Lama是一个完全自托管的图像处理工具,基于最前沿的AIGC模型,它可以从图片中删除任何不需要的物体.缺陷或对象,却看不到一点修改痕迹~ 在以前,我们想将图片中的文字.水印去除,可以使用ps,但ps的 ...
- C++移动构造与std::move()
背景及问题 如下程序所示: #include<iostream> class MyString { public: MyString() = default; MyString(const ...
- 论文阅读小结(B/S和C/S结构)
论文阅读小结 一.B/S 和 C/S 软件体系结构选择 1) C/S . B/S 结构概述 C/S 结构,即 Client/Server (客户机 / 服务器 ), C/S 结构软件分为客户机和服务器 ...
- Scala 特质自身类型
1 package chapter06 2 3 object Test16_TraitSelfType { 4 def main(args: Array[String]): Unit = { 5 va ...
- 如何拿到接口返回的消耗token
SemanticKernel 以下引用自官方案例 Text模型 使用Kernel FunctionResult functionResult = await kernel.InvokePromptAs ...