(AtCoder Beginner Contest 375) 题解(下)

embedded/2024/10/15 20:06:38/

一、题解

第 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.ppmy.cn/embedded/128047.html

相关文章

使用Python抓取并分析外汇汇率数据

使用Python抓取并分析外汇汇率数据 在当今全球化的经济环境中&#xff0c;了解不同货币之间的汇率是非常重要的。对于个人投资者、旅行者以及企业来说&#xff0c;准确及时的汇率信息可以帮助他们做出更加明智的决策。本文将介绍如何使用Python编程语言来从网络上获取最新的外…

Unity游戏通用框架——UI的管理和加载

需求&#xff1a;为了方便UI的管理&#xff0c;编写一个管理类&#xff0c;管理所有UI的加载、隐藏或销魂&#xff0c;每个UI都继承自一个UIWindow类&#xff0c;存放在Resource的指定目录下&#xff0c;通过UIManager进行管理。每个继承自UIWindow的UI天然有UI的打开关闭等基本…

Python 无法安装pybluez 解决办法

直接使用 pip install pybluez 安装会报错 那么可以尝试手动安装 先下载 pybluez-0.30的包&#xff1a; CSDN&#xff1a; https://download.csdn.net/download/rotion135/89884852 Github&#xff1a;https://github.com/pybluez/pybluez 先安装依赖 sudo apt-get install …

Kafka之生产者

本章内容将整理下Kafka体系结构中的生产者相关的一些知识。 1. 生产者客户端 生产者客户端在Kafka的发展历程当中一共有两个重大版本&#xff1a; 一个是基于Scala语言开发的版本&#xff0c;称为Old Producer或Scala版的生产者客户端。一个是Kafka0.9.x版本之后以Java语言开发…

【微服务】微服务注册:构建灵活的服务管理机制

目录 引言一、什么是微服务注册&#xff1f;1.1 服务注册中心的作用1.2 服务注册中心的工作原理1.3 示意图 二、常见的微服务注册中心2.1 各注册中心详细对比 三、微服务注册的实现方式3.1 Spring Cloud Netflix Eureka3.2 Consul3.3 Zookeeper3.4 etcd 四、微服务注册的注意事…

JavaScript 入门

1. HTML、CSS、JavaScript 之间的关系 HTML&#xff1a;网页的结构&#xff08;骨&#xff09; CSS&#xff1a;网页的表现&#xff08;皮&#xff09; JavaScript&#xff1a;网页的行为&#xff08;魂&#xff09; 2. 引入方式 3种引入方式&#xff0c;语法如下&#xff…

【Unity - 屏幕截图】技术要点

在Unity中想要实现全屏截图或者截取某个对象区域的图片都是可以通过下面的函数进行截取 Texture2D/// <summary>/// <para>Reads the pixels from the current render target (the screen, or a RenderTexture), and writes them to the texture.</para>/…

【unity框架开发起步】一些框架开发思维和工具类封装

文章目录 前言一、Editor操作二、快捷导出unity包三、快捷打开存储目录四、封装概率函数五、方法过时六、partial 关键字&#xff0c;拆开合并类七、从数组中随机取⼀个数值并进⾏返回1、实现2、object 类优化3、泛型&#xff0c;结构复⽤利器4、params 关键字优化 八、abstrac…