题解:CF1936C Pokmon Arena

news/2025/11/2 0:25:08/文章来源:https://www.cnblogs.com/CharlieCai/p/19184099

考虑如何建图,首先对于 \(n\) 个人的 \(m\) 个属性我们都建一个点,表示目前第 \(j\) 个属性达到了 \(a_{i,j}\) 的代价。为了计算每个人的出场费用,我们再新建 \(n\) 个点(记其编号为 \(b_i\)),分别表示现在场上是第 \(i\) 个人的代价。显然对于表示第 \(i\) 个人 \(m\) 个属性的所有点都应该建一条指向 \(b_i\) 的边权为 \(c_i\) 的边,表示派出了第 \(i\) 个人进行挑战;\(b_i\) 应该向表示第 \(i\) 个人 \(m\) 个属性的所有点建一条边权为 \(0\) 的边,表示第 \(i\) 个人上场后使用他的属性进行后续的挑战。

由于是花费 \(k\) 的代价将 \(a_{i,j}\) 永久增加 \(k\),所以后续再次使用一个较小的第 \(j\) 个属性进行挑战的话还要再加一次 \(k\),显然这是不优的,最优策略应该是找到 \(n\) 个第 \(j\) 个属性中恰好比 \(a_{i,j}\) 大的那个(记为 \(a_{t,j}\)),只由 \(a_{t,j}\) 花费 \(a_{t,j}-a_{i,j}\) 的代价转移到 \(a_{i,j}\)。因此,对于所有第 \(j\) 类属性,我们将它们从小到大排序,从大到小建一条链,其中每条边的边权是两个相邻属性的差;再反着建一条链,其中每条边的边权为 \(0\)(属性比下一个大的时候不用花费代价增加属性)。

这样我们就完成了建图,初始值 \(dis_{b_{1}}\) 设为 \(0\) 跑最短路即可,最后 \(dis_{b_{n}}\) 即为答案。

#include<bits/stdc++.h>
#define MAXN 1000005
#define int long long
#define pi pair<int,int>
#define mk make_pair
using namespace std;
const int inf=1e18;
int id,T,n,m,dis[MAXN],head[MAXN],cnt,c[MAXN];
vector<pi>d[MAXN];
struct Node{int value,next,w;
}edge[MAXN*8];
void addedge(int u,int v,int w){edge[++cnt].value=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt;
}
void dij(){priority_queue<pi,vector<pi>,greater<pi> >q;dis[n*m+1]=0;q.push(mk(0,n*m+1));while(!q.empty()){int x=q.top().second,d=q.top().first;q.pop();if(d!=dis[x])continue;for(int i=head[x];i;i=edge[i].next){int y=edge[i].value,w=edge[i].w;if(dis[y]>dis[x]+w){dis[y]=dis[x]+w;q.push(mk(dis[y],y));}}}
}
int fnum(int x,int y){return (x-1)*m+y;
}
signed main(){
//	freopen("pokemon.in","r",stdin);
//	freopen("pokemon.out","w",stdout);scanf("%lld",&T);while(T--){for(int i=1;i<=n*m+n;i++)head[i]=0;for(int i=1;i<=m;i++)d[i].clear();scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&c[i]);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int x;scanf("%lld",&x);d[j].push_back(mk(x,i));}}for(int i=1;i<=m;i++){sort(d[i].begin(),d[i].end());for(int j=0;j<d[i].size()-1;j++){int x=fnum(d[i][j].second,i),y=fnum(d[i][j+1].second,i);addedge(y,x,d[i][j+1].first-d[i][j].first);addedge(x,y,0);} }for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){addedge(fnum(i,j),n*m+i,c[i]);addedge(n*m+i,fnum(i,j),0);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)dis[fnum(i,j)]=inf;dis[n*m+i]=inf;}dij();printf("%lld\n",dis[n*m+n]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:CF983E NN country

首先思考线路只有从祖先到子孙的链的情况,对于询问的两个点 \(x\) 和 \(y\),我们肯定要先从 \(x\) 跳到它们的 LCA,再从 LCA 跳到 \(y\)。由于从 LCA 到 \(y\) 的过程和从 \(y\) 到 LCA 的过程是等价的,所以我们可…

CSP-S 2023 游记

1. 你知道吗?红绿灯倒计时的第一位的取值范围不是 0~9,而是 0~F。 半个十六进制的红绿灯。 半个有 OI 的生活。 第一次看到它,是在考完 csps2023 回家的路上,我家长确信那只是二极管失灵,但我亲眼看到它从 E,到…

软件技术基础的第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc/homework/13541这个作业的目标 建立本地项目并关联远程仓库,熟悉程序设计的流程姓名-学号 熊宇彤-2023331200153码云仓库地址:https://gitee.com/…

补发周五日报10.31

所花时间:90min 今天主要学习内容主要是机器学习,上课没咋听 知识点总结 这个问题很关键,决策树是机器学习的基础算法,也是软件设计师考试中机器学习部分的高频考点!核心结论:决策树是一种基于 “分而治之” 思想…

CSP2025-S 游记

Day -2 早上写了教练的模拟赛,下午讲题。 晚上和 @Kevin_Mu 一起研究了神秘的dfs序求LCA,发现非常好写,同时学了ST表。 Day -1 努力的刷板子,但是头疼只写了一点点,然后把所有写过的板子看了看,把很久没写过的单…

langgraph-reflection

langgraph-reflection https://github.com/fanqingsong/langgraph-reflectionDescriptionArchitectureThis reflection agent uses two subagents:- A "main" agent, which is the agent attempting to solv…

学习日报11.2

所花时间:1h 代码量:0 搏客量:2 所学知识点:今天所学的内容是有关于中级软件设计师备考内容 关于上午题 由于所学知识点比较多,且杂乱,就简单叙述一下,大致是有关于有限自动机,一个叫状态图的认识,刚开始比较…

2025CSP-S游记

DAY -13 脱产了。正好还是运动会,到时候会有人来一起在机房。 DAY -12~-10 运动会,感觉好青春啊 hhh。这个气温也是迅速下降,好在机房还是冬暖夏凉。 DAY -9~-5 一个人在机房,但其实也还好,主要就是做同学的好题题…

获取网页logo图标(ico文件)

怎么获取网页logo图标的URL链接 第一种方法:最常用的方法(适用于90%的站点)是,直接在访问网址首页链接后加上上/favicon.ico,例如:https://www.baidu.com/favicon.ico 第二种方法:按F12,进入开发者模式。以wi…

题解:P6811 「MCOI-02」Build Battle 建筑大师

设 $f_i$ 为匹配到第 $i$ 为的序列个数,令 $last_{x,i}$ 表示从第 $i$ 为往前第一个出现 $x$ 的位置,可以得到转移 $f_i=\sum_{j=last_{a_i,i}}^{i-1}{f_j}$。最后答案即为 $\sum{f}$。 由于本题 $a$ 的特殊性,所有…

[KaibaMath]1017 关于收敛数列与其子数列之间的关系定理的证明

[KaibaMath]1017 关于收敛数列与其子数列之间的关系定理的证明收敛数列的任意子数列必收敛,且极限与原数列的极限一致。反之,若一个数列存在发散的子数列,或存在两个极限不同的子数列,则该数列必发散。下面给出收敛…

Day9综合案例一

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

学习日报11.1

所花时间:2h 代码量:200 所学知识点: 今日核心知识点总览 有限自动机(FA):含核心五要素(状态集合、输入符号集合等),区分 DFA 与 NFA,掌握 NFA 转 DFA 的子集构造法及字符串识别流程。 上下文无关文法:明确…

团队展示选题:KFCoder✅日常健康打卡系统

项目 内容这个作业属于哪个课程 ->点我进入课程主页这个作业要求在哪里 ->点我查看作业要求这个作业的目标 成立团队并完成选题,初步确立团队计划Github仓库链接 zhiyuxinxuan/KFCoder一、团队展示 队名:KFCod…

UE:快速创建一个地图

这里只讨论如何快速创建一个可用的标准地图,不包括世界分区地图。 先Ctrl+空格呼出内容浏览器,鼠标右击选择关卡打开窗口->环境光照混合器依次点击这些按钮就能创建一个完整的标准地图,方便又快捷。 如果要创建地…

以数据为中心的计算机视觉模型性能分析工具-FiftyOne -1

提高数据质量和了解模型的故障模式是提高模型性能的最有效方法。 FiftyOne是一个开源工具,为数据集标记和计算机视觉模型分析提供了强大的图形界面。“提高数据质量和了解模型的故障模式是提高模型性能的最有效方法。…

23 种设计模式完整指南 - C++实现详解

23 种设计模式完整指南 - C++实现详解 目录设计模式概览 创建型模式 结构型模式 行为型模式 实践应用 总结设计模式概览 设计模式是解决软件设计中常见问题的可重用方案。它们提供了经过验证的解决方案,帮助开发者编写…

[Linux] Linux创建用户流程

[Linux] Linux创建用户流程$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录以创建用户组和用户 mgter 为例: 以创建用户组和用户 mgter 为例: #!/bin/…