(AtCoder Beginner Contest 375) 题解(下)

一、题解

第 E 题 3 Team Division

一眼看像背包,观察数据范围,合法的总能力值 ≤ 500 \le 500 500,那么我们可以设计一个背包DP:

int dp[110][510][510];
//dp[i][j][k] 表示前 i 个人,分给第一组的能力值是 j,第二组是 j最小换人次数。

那么可得转移:

dp[i][j][k]=min(dp[i-1][j-b[i]][k]+1-(a[i]==1));
dp[i][j][k]=min(dp[i-1][j][k-b[i]]+1-(a[i]==2));
dp[i][j][k]=min(dp[i-1][j][k]+1-(a[i]==3));

那么接下来就很简单了:

#include <bits/stdc++.h>
using namespace std;
int dp[110][510][510],a[510],b[510];
signed main(){memset(dp,0x3f,sizeof(dp));int n,sum=0; cin>>n; dp[0][0][0]=0;for (int i=1; i<=n; i++){cin>>a[i]>>b[i]; sum+=b[i];}if (sum%3!=0){cout<<-1; return 0;}for (int i=1; i<=n; i++){for (int j=0; j<=sum/3; j++){for (int k=0; k<=sum/3; k++){if (j>=b[i]) dp[i][j][k]=min(dp[i][j][k],dp[i-1][j-b[i]][k]+1-(a[i]==1));if (k>=b[i]) dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k-b[i]]+1-(a[i]==2));dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+1-(a[i]==3));}}}cout<<(dp[n][sum/3][sum/3]>1e8?-1:dp[n][sum/3][sum/3]);return 0;
}

第 F 题 Road Blocked

我们发现,我们删除条边跑最短路是 O ( n 3 ) O(n^3) O(n3) 的,但是我们加入一条边,影响的最短路
需要经过这条边,通过优化可降至 O ( n 2 ) O(n^2) O(n2)
在这里插入图片描述 n e w d i s i , j = m i n ( d i s i , j , d i s i , u + d i s v , j + w , d i s i , v + d i s u , j + w ) newdis_{i,j}=min(dis_{i,j},dis_{i,u}+dis_{v,j}+w,dis_{i,v}+dis{u,j}+w) newdisi,j=min(disi,j,disi,u+disv,j+w,disi,v+disu,j+w)

利用这个公式,我们可以处理加边最短路了!

接下来我们可以倒序处理询问即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define Q 200010
int dis[310][310],ans[Q];
int type[Q],x[Q],y[Q];
int u[Q],v[Q],w[Q];
signed main(){set <int> st;memset(dis,0x3f,sizeof(dis));int n,m,q; cin>>n>>m>>q;for (int i=1; i<=n; i++) dis[i][i]=0;for (int i=1; i<=m; i++){cin>>u[i]>>v[i]>>w[i];}for (int i=1; i<=q; i++){cin>>type[i]>>x[i];if (type[i]==2) cin>>y[i];else st.insert(x[i]);}for (int i=1; i<=m; i++){if (!st.count(i)){dis[u[i]][v[i]]=w[i];dis[v[i]][u[i]]=w[i];}}for (int k=1; k<=n; k++){for (int i=1; i<=n; i++){for (int j=1; j<=n; j++){dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);}}}for (int i=q; i>=1; i--){if (type[i]==1){int U=u[x[i]],V=v[x[i]],W=w[x[i]];for (int a=1; a<=n; a++){for (int b=1; b<=n; b++){dis[a][b]=min({dis[a][b],dis[a][U]+dis[V][b]+W,dis[a][V]+dis[U][b]+W});}}ans[i]=-2;}else ans[i]=(dis[x[i]][y[i]]>1e15?-1:dis[x[i]][y[i]]);}for (int i=1; i<=q; i++) if (ans[i]!=-2) cout<<ans[i]<<"\n";return 0;
}

第 G 题 Road Blocked 2

题意是给你一个图,问固定一条边,最短路十分变化。

我们固定边的公式与加边相同,详见 F 题。

注意到,变化 只会变大,下面我们仔细考虑变大的条件:

  • 固定边最短路和最短路相同。
  • 固定边最短路数量和最短路数量相同。

最短路数量可以在 Dijkstra 中记录。

现在考虑一个问题,最短路数量可能达到 2 n 3 2^\frac{n}{3} 23n,其实我们将数量对 998244353 998244353 998244353 取膜即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 200010
#define M 998244353
vector <pair<int,int>> vc[N];
int cnt[N][2],vis[N][2],dis[N][2],n,u[N],v[N],w[N];
void dijkstra(int op){priority_queue <pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;q.push({0,(op?n:1)}); dis[(op?n:1)][op]=0; cnt[(op?n:1)][op]=1;while (!q.empty()){int id=q.top().second; q.pop();if (vis[id][op]) continue; vis[id][op]=1;for (auto x:vc[id]){int u=x.first,w=x.second;if (dis[id][op]+w<dis[u][op]){dis[u][op]=dis[id][op]+w;cnt[u][op]=cnt[id][op];q.push({dis[u][op],u});}else if (dis[id][op]+w==dis[u][op]){cnt[u][op]+=cnt[id][op];cnt[u][op]%=M;}}}
}signed main(){memset(dis,0x3f,sizeof(dis));int m,hs1,hs2; cin>>n>>m;for (int i=1; i<=m; i++){cin>>u[i]>>v[i]>>w[i];vc[u[i]].push_back({v[i],w[i]});vc[v[i]].push_back({u[i],w[i]});}dijkstra(0); dijkstra(1);for (int i=1; i<=m; i++){hs1=cnt[n][0];int x=dis[u[i]][0]+dis[v[i]][1]+w[i];int y=dis[v[i]][0]+dis[u[i]][1]+w[i];if (x<y) hs2=cnt[u[i]][0]*cnt[v[i]][1]%M;else if (x>y) hs2=cnt[v[i]][0]*cnt[u[i]][1]%M;else hs2=cnt[u[i]][0]*cnt[v[i]][1]%M+cnt[v[i]][0]*cnt[u[i]][1]%M;if (hs1%M==hs2%M&&min(x,y)==dis[n][0]) cout<<"Yes\n";else cout<<"No\n";}return 0;
}

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

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

相关文章

微服务架构 --- 使用Seata处理分布式事务

目录 一.Seata 是什么? 1.Seata的核心架构&#xff1a; 2. Seata的分布式事务处理流程&#xff1a; 二.Seata的基本使用&#xff1a; 1.环境准备&#xff1a; 2.引入依赖&#xff1a; 3.加入配置来使用Seata&#xff1a; &#xff08;1&#xff09;首先在nacos上添加一…

免费版视频压缩软件:让视频处理更便捷

现在不少人已经习惯通过视频来记录生活、传播信息和进行娱乐的重要方式。但是由于设备大家现在录制的文件都会比较大&#xff0c;这时候就比较需要一些缩小视频的工具了。今天我们一起来探讨视频压缩软件免费版来为我们带来的生动世界。 1.Foxit视频压缩大师 链接直达&#x…

ESP32移植Openharmony外设篇(1)MQ-2烟雾传感器

外设篇 实验箱介绍 旗舰版实验箱由2部分组成&#xff1a;鸿蒙外设模块&#xff08;支持同时8个工作&#xff09;、鸿蒙平板。 其中&#xff0c;鸿蒙平板默认采用RK3566方案。 OpenHarmony外设模块采用底板传感器拓展板方式&#xff0c;底板默认采用ESP32方案&#xff0c;也…

青少年编程能力等级测评CPA C++一级试卷(1)

青少年编程能力等级测评CPA C一级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; CP1_1_1&#xff0e;在C中&#xff0c;下列变量名正确的是&#xff08; &#xff09;。 A&#xff0e;$123 B&#…

Redis 的安装与部署(图文)

前言 Redis 暂不支持Windows 系统&#xff0c;官网上只能下载Linux 环境的安装包。但是启用WSL2 就可以在Windows 上运行Linux 二进制文件。[要使此方法工作&#xff0c;需要运行Windows 10 2004版及更高版本或Windows 11]。本文在CentOS Linux 系统上安装最新版Redis&#xf…

【C++】unordered_set、unordered_map超详细封装过程,处理底层细节

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言1、数据泛型2、迭代器2.1 重载2.2 begin、end2.3 const迭代器2.4 unordered_map中[]重载 3、特殊类型 总结 前…

如何设计开发RTSP直播播放器?

技术背景 我们在对接RTSP直播播放器相关技术诉求的时候&#xff0c;好多开发者&#xff0c;除了选用成熟的RTSP播放器外&#xff0c;还想知其然知其所以然&#xff0c;对RTSP播放器的整体开发有个基础的了解&#xff0c;方便方案之作和技术延伸。本文抛砖引玉&#xff0c;做个…

Unity 实战案例全解析 实现时间停止效果+世界变灰

画面里运动的那个小玩意这么写 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Partol : MonoBehaviour {public Transform pos1;public Transform pos2;public float speed;private Transform target;void Start() {target p…

前端开发攻略---取消已经发出但是还未响应的网络请求

目录 注意&#xff1a; 1、Axios实现 2、Fetch实现 3、XHR实现 注意&#xff1a; 当请求被取消时&#xff0c;只会本地停止处理此次请求&#xff0c;服务器仍然可能已经接收到了并处理了该请求。开发时应当及时和后端进行友好沟通。 1、Axios实现 <!DOCTYPE html> &…

性能测试工具JMeter

本次使用的博客系统的url&#xff1a; http://8.137.19.140:9090/blog_edit.html 1. JMeter介绍 环境要求&#xff1a;要求java&#xff0c;jdk版本大于8&#xff1b; Apache JMeter 是 Apache 组织基于 Java 开发的压⼒测试⼯具&#xff0c;⽤于对软件做性能测试&#xff1b…

带新手用一套坦克大战搞定Java核心编程

有不少在校大学生朋友私信笔者&#xff0c;觉得现在的Java教程学的比较枯燥&#xff0c;有没有能学到基础知识同时还有做项目感觉的教程。因为笔者最早接触Java时学的是马士兵老师、韩顺平老师这样的大佬当时出的教程&#xff0c;尤其印象深刻的是二位大佬的坦克大战项目&#…

基于DSP+ARM+FPGA的电能质量分析仪的软件设计

软件设计是电能质量设备的核心内容&#xff0c;上述章节详细介绍了电能质量参数的 算法&#xff0c;并且通过仿真实验进行了验证&#xff0c;本章将结合现代电能质量监测设备需求实 现算法在实际电网中应用。根据设计的电能质量分析仪的需求分析&#xff0c;进行总体的 软件…

Java筑基之路:运算符深入(下)

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;小菜元 &#x1f35f;博客主页…

计算机网络:数据链路层 —— 共享式以太网

文章目录 共享式以太网CSMA/CD 协议CSMA/CD 协议 的基本原理 共享式以太网的争用期共享式以太网的最小帧长共享式以太网的最大帧长共享式以太网的退避算法截断二进制指数退避算法 共享二进制以太网的信道利用率使用集线器的共享式以太网10BASE-T 共享式以太网 共享式以太网是当…

51单片机数码管循环显示0~f

原理图&#xff1a; #include <reg52.h>sbit dulaP2^6;//段选信号 sbit welaP2^7;//位选信号unsigned char num;//数码管显示的数字0~funsigned char code table[]{ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//定义数码管显…

yakit使用教程(四,信息收集)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a;yakit下载安装教程。 一&#xff0c;基础爬虫。 在新建项目或新建临时项目后&#xff0c;点击安全工具&#xff0c;点击基础爬虫。 此工具并不是为了爬取网站上的一…

navicat下载教程(包会的)

目录 一、下载navicat安装包 步骤1---试用版本 步骤2---下载windws系统的navicat​编辑 步骤3---查看安装包 二、安装navicat 三、唤醒navicat 四、成功唤醒navicat 官网地址&#xff1a;Navicat | 下载 Navicat Premium 14 天免费 Windows、macOS 和 Linux 的试用版 …

[Linux] 创建可以免密登录的SFTP用户

本文主要包含: 创建新用户创建密钥对用于免密登录新用户将新建用户改造为SFTP用户为SFTP上传数据设置限速 1. 创建新用户 sudo useradd sftp_user sudo passwd sftp_user # 输入密码2. 创建密钥对 参考这篇文章 [Linux] 生成 PEM 密钥对实现服务器的免密登录 3. 将新建用户…

牛客习题—线性DP 【mari和shiny】C++

你好&#xff0c;欢迎阅读我的文章~ 个人主页&#xff1a;Mike 所属专栏&#xff1a;动态规划 mari和shiny mari和shiny ​ 分析: 使用动态规划的思路来解决。 思路&#xff1a; 分别统计s&#xff0c;sh&#xff0c;shy的数量即可。使用ss来统计字符s的数量&#xff0c;使…

ORA-65096:公用用户名或角色名无效

CREATE USER DATA_SHARING IDENTIFIED BY "Ab2"; Oracle建立用户的的时候&#xff0c;可能会出现一直提示 ORA-65096:公用用户名或角色名无效&#xff1b; 我查了一下&#xff0c;好像是 oracle 12版本及以上版本的特性&#xff0c;用户名必须加c##或者C##前缀才能创…