Codeforces Round 954 (Div. 3) (A~F)(不会数学)

A - X Axis 

        

暴力枚举一下所有可能

void solve() 
{int a , b , c;cin >> a >> b >> c;int ans = 100;for(int i = 0 ; i <= 10 ; i ++){ans = min(ans , abs(i - a) + abs(i - b) + abs(i - c));}	cout << ans << endl;
}    

B - Matrix Stabilization 

        

可以观察到:若一个数比周围四个数都大,那么最终会变成四个数当中最大的哪一个。

        

void solve() 
{int n , m;cin >> n >> m;int mp[n][m];for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < m ; j ++){cin >> mp[i][j];}}	for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < m ; j ++){int ma = -1;if(i > 0){ma = max(ma , mp[i - 1][j]);}if(i + 1 < n){ma = max(ma ,  mp[i + 1][j]);}if(j > 0){ma = max(ma , mp[i][j - 1]);}if(j + 1 < m){ma = max(ma , mp[i][j + 1]);}cout << min(mp[i][j] , ma) << " ";}cout << endl;}
}   

C - Update Queries 

        

对字符串c以及ind数组进行排序,通过贪心可以知道,我们需要按照索引从小到大的修改字符串,同时一个位置只会有一个字母与之对应,因此只需要同时按照字符串c从小到大修改即可。

        

void solve() 
{int n , m;cin >> n >> m;string s;cin >> s;	int a[m];map<int,int>mp;for(int i = 0 ; i < m ; i ++){cin >> a[i];mp[a[i]]++;}char c[m];string str;cin >> str;for(int i = 0 ; i < m ; i ++){c[i] = str[i];}sort(c , c + m);int id = 0;for(auto it : mp){int x = it.first;x--;s[x] = c[id++];}for(int i = 0 ; i < n ; i ++){cout << s[i];}cout << endl;
}   

D - Mathematical 问题 

        

      归纳题,观察后可以发现:一定有一个两位数,因此我们可以枚举这个两位数,然后取最小值。

        接下来考虑如何取最小值:若存在数字0,那么可以通过都用乘法来将最终结果变成0,此外,若存在数字1,可以通过乘法将1消掉。除此之外的数,都是加法更加小。按照此策略来模拟即可。

        

void solve() 
{int n;cin >> n;string s;cin >> s;int mask[n];for(int i = 0 ; i < n ; i ++){mask[i] = s[i] - '0';}	int ans = 101010;for(int i = 1 ; i < n ; i ++){vector<int>tmp;int tot = 0;for(int j = 0 ; j < n ; j ++){if(j == i - 1){int x = mask[j] * 10 + mask[j + 1];tmp.pb(x);j++;}else{tmp.pb(mask[j]);}}for(auto it : tmp){if(it == 0){cout << 0 << endl;return;}if(it == 1){continue;}else{tot += it;}}if(tot == 0) tot++;ans = min(ans , tot);}cout << ans << endl;
}  

E - Beautiful Array 

        

        思路:我们对所有模k情况下相同的数放到一组,组内的任意两个数都可以通过操作变成相同的数。然后考虑一个组内怎么样才能使得答案最小,显然将相近的两个数放到两边可以将答案变小。因此只需要排序,然后对相邻的两个数两两配对即可。由于需要两两配对,因此若一个组内的数的个数为奇数,除非将一个数放在正中间,否则一定无法满足题意。

        若n为奇数,那么需要有一个数放在正中间,也就是需要有一个组内的数的个数为奇数。接下来考虑怎么计算将谁放在中间最合适。假设组内数的个数为n,那么需要找出k = n/2组数来进行配对,考虑将某个位置上的数放到中间后的答案是怎样的:从开头两两配对所组成的x组 + 从结尾两两配对所组成的y = k - x(0\leq x \leq k)。因此可以通过一个前缀数组跟一个后缀数组来记录这些值,然后遍历x来找到最小值。

        

void solve() 
{int n , k;cin >> n >> k;vector<int>idx[n];map<int,int>mp;int id = 0;set<int>st;		for(int i = 0 ; i < n ; i ++){cin >> a[i];int res = a[i] % k;if(st.count(res)){int idk = mp[res];idx[idk].pb(a[i] / k);}else{st.insert(res);mp[res] = id++;idx[mp[res]].pb(a[i] / k);}}int ans = 0;int f = 0;if(n & 1){f++;}for(int i = 0 ; i < id ; i ++){sort(idx[i].begin() , idx[i].end());if(idx[i].size() % 2 == 0){for(int j = 0 ; j < idx[i].size() ; j += 2){ans += idx[i][j + 1] - idx[i][j];}}else{if(f){int k = idx[i].size() / 2;vector<int>pre(k + 5  , 0);//总共k个值int id = 1;for(int j = 0 ; j + 1 < idx[i].size() ; j += 2){pre[j / 2 + 1] = pre[j / 2] + idx[i][j + 1] - idx[i][j];}				vector<int>suf(k + 5 , 0);for(int j = idx[i].size() - 1 ; j >= 1 ; j -= 2){suf[j / 2 - 1] = suf[j / 2 ] + idx[i][j] - idx[i][j - 1];}int ma = 1e18;for(int j = 0 ; j <= k ; j ++){ma = min(ma , pre[j] + suf[j]);}ans += ma;f--;}else{f = -1;break;}}}if(!f){cout << ans << endl;}else{cout << -1 << endl;}
}   

 F - Non-academic 问题

        

        可以发现:若存在一个多元环(环上的点大于2),那么无法通过删除一条边来改变他们的连通情况。因此,对于那些多元环而言,我们可以将其缩成一个点。最终:我们通过缩点可以得到一个没有环的连通图,也就是树。接下来只需要通过枚举树上的每条边,将其变成两棵树,然后求出答案的最小值即可。

        用无向图的tarjan可以将这些多元环缩成一个点,然后再用树的算法来统计子树的大小跟答案即可。(无向图的tarjan跟有向图的tarjan很像,只需要一条边不连续走两次即可)

        

        

// Problem: F. Non-academic Problem
// Contest: Codeforces - Codeforces Round 954 (Div. 3)
// URL: https://codeforces.com/contest/1986/problem/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
#define int long long
const LL maxn = 4e05+7;
const LL N = 5e05+10;
const LL mod = 1e09+7;
const int inf = 0x3f3f3f3f;
const LL llinf = 5e18;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >mi;//小根堆
priority_queue<LL> ma;//大根堆
LL gcd(LL a, LL b){return b > 0 ? gcd(b , a % b) : a;
}LL lcm(LL a , LL b){return a / gcd(a , b) * b;
}
int n , m;
vector<int>a(N , 0);
void init(int n){for(int i = 0 ; i <= n ; i ++){a[i] = 0;}
}
struct SCC {int n;std::vector<std::vector<int>> adj;//邻边std::vector<int> stk;//存储同一个SCCstd::vector<int> dfn, low, bel;//dfn : dfs的时间戳 low : 子树能跳到的最上方的点 bel : 结点位于哪块强连通分量上 int cur, cnt;SCC() {}SCC(int n) {init(n);}void init(int n) {this->n = n;adj.assign(n, {});dfn.assign(n, -1);low.resize(n);bel.assign(n, -1);stk.clear();cur = cnt = 0;}void addEdge(int u, int v) {adj[u].push_back(v);}void dfs(int x , int fa) {dfn[x] = low[x] = cur++;stk.push_back(x);for (auto y : adj[x]) {if(y == fa) continue;if (dfn[y] == -1) {dfs(y , x);low[x] = std::min(low[x], low[y]);} else if (bel[y] == -1) {low[x] = std::min(low[x], dfn[y]);}}if (dfn[x] == low[x]) {int y;do {y = stk.back();bel[y] = cnt;stk.pop_back();} while (y != x);cnt++;}}std::vector<int> work() {for (int i = 0; i < n; i++) {if (dfn[i] == -1) {dfs(i , -1);}}return bel;}
};
struct HLD {//轻重链剖分int n;std::vector<int> siz, top, dep, parent, in, out, seq , val;//子树大小 所在重链的顶部节点 深度 父亲 子树DFS序的起点 子树DFS序的终点std::vector<std::vector<int>> adj;int cur = 1;HLD() {}HLD(int n) {init(n);}void init(int n) {this->n = n;siz.resize(n);top.resize(n);dep.resize(n);parent.resize(n);in.resize(n);out.resize(n);seq.resize(n);val.assign(n , 0);cur = 0;adj.assign(n, {});}void addEdge(int u, int v) {adj[u].push_back(v);adj[v].push_back(u);}void work(int root = 1) {top[root] = root;dep[root] = 0;parent[root] = -1;dfs1(root);dfs2(root);}void dfs1(int u) {if (parent[u] != -1) {adj[u].erase(std::find(adj[u].begin(), adj[u].end(), parent[u]));}siz[u] = 1;for (auto &v : adj[u]) {parent[v] = u;dep[v] = dep[u] + 1;dfs1(v);siz[u] += siz[v];if (siz[v] > siz[adj[u][0]]) {std::swap(v, adj[u][0]);}}}void dfs2(int u) {in[u] = ++cur;seq[in[u]] = u;for (auto v : adj[u]) {top[v] = v == adj[u][0] ? top[u] : v;dfs2(v);val[u] += val[v];}out[u] = cur;}int lca(int u, int v) {while (top[u] != top[v]) {if (dep[top[u]] > dep[top[v]]) {u = parent[top[u]];} else {v = parent[top[v]];}}return dep[u] < dep[v] ? u : v;}int dist(int u, int v) {return dep[u] + dep[v] - 2 * dep[lca(u, v)];}int jump(int u, int k) {if (dep[u] < k) {return -1;}int d = dep[u] - k;while (dep[top[u]] > d) {u = parent[top[u]];}return seq[in[u] - dep[u] + d];}bool isAncester(int u, int v) {//是否为祖先return in[u] <= in[v] && in[v] < out[u];}int rootedParent(int u, int v) {std::swap(u, v);if (u == v) {return u;}if (!isAncester(u, v)) {return parent[u];}auto it = std::upper_bound(adj[u].begin(), adj[u].end(), v, [&](int x, int y) {return in[x] < in[y];}) - 1;return *it;}int rootedSize(int u, int v) {if (u == v) {return n;}if (!isAncester(v, u)) {return siz[v];}return n - siz[rootedParent(u, v)];}int rootedLca(int a, int b, int c) {return lca(a, b) ^ lca(b, c) ^ lca(c, a);}
};
void solve() 
{int n , m;cin >> n >> m;SCC scc(n + 5);pair<int,int>p[m];for(int i = 0 ; i < m ; i ++){int u , v;cin >> u >> v;scc.addEdge(u , v);scc.addEdge(v , u);p[i].x = u;p[i].y = v;}vector<int>v = scc.work();int ma = -1;for(int i = 1 ; i <= n ; i ++){ma = max(ma , v[i]);}HLD hld(ma + 5);for(int i = 0 ; i < m ; i ++){int u = v[p[i].x] , x = v[p[i].y];if(u == x) continue;hld.addEdge(u , x);}for(int i = 1 ; i <= n ; i ++){hld.val[v[i]]++;}hld.work();int ans = n * (n - 1) / 2;for(int i = 2 ; i <= ma ; i ++){ans = min(ans , hld.val[i] * (hld.val[i] - 1) / 2 + (n - hld.val[i]) * (n - hld.val[i] - 1) / 2);}cout << ans << endl;
}            
signed main() 
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout.precision(10);int t=1;cin>>t;while(t--){solve();}return 0;
}

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

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

相关文章

【数据分享】2006-2023《中国贸易外经统计年鉴》

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139707771 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

webpack【实用教程】

基础配置 配置的拆分和合并 通常 webpack 的配置文件会有3个 webpack.common.js 公共配置&#xff08;会被另外两个配置文件导入并合并&#xff09;webpack.dev.js 开发环境的配置webpack.prod.js 生产环境的配置 开发环境的本地服务 在 webpack.dev.js 中配置 devServer:…

使用鸿蒙HarmonyOs NEXT 开发b站的卡片效果 手把手教学

资源准备&#xff1a; 需要4张图片&#xff1a;分别是页面图&#xff0c;播放图标&#xff0c;评论图标&#xff0c;更多图标 1.实现效果显示&#xff1a; 2.教学视频&#xff1a; 使用鸿蒙HarmonyOs NEXT 开发b站卡片_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1…

Huffman树——AcWing 148. 合并果子

目录 Huffman树 定义 运用情况 注意事项 解题思路 AcWing 148. 合并果子 题目描述 运行代码 代码思路 其它代码 代码思路 Huffman树 定义 它是一种最优二叉树。通过构建带权路径长度最小的二叉树&#xff0c;经常用于数据压缩等领域。 运用情况 在数据压缩中&a…

【机器学习】半监督学习可以实现什么功能?

目录 一、什么是机器学习二、半监督学习算法介绍三、半监督学习算法的应用场景四、半监督学习可以实现什么功能&#xff1f; 一、什么是机器学习 机器学习是一种人工智能技术&#xff0c;它使计算机系统能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。它涉及到…

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用 判断员工是否有权限访问&#xff0c;首先得知道现在操作的人是谁&#xff0c;所以必须先实现登录功能 2 登录流程 ① 提供登录页面&#xff0c;可输入用户名与密码信息&#xff0c;并添加执行登录的按钮。&#xff08;登录页面不能被拦截&#xff09;…

意识清晰,对答如流,但手脚活动受限 是脊髓损伤?

在医学领域&#xff0c;有一种情况常常令人困惑&#xff1a;患者意识清醒&#xff0c;交流无碍&#xff0c;但手脚的活动却受到限制。这种情况可能源于多种原因&#xff0c;其中之一就是脊髓损伤。本文将对脊髓损伤进行科普&#xff0c;帮助大家更好地理解这一复杂的医学问题。…

AIGC技术的发展现状与未来趋势探讨

AIGC技术的发展现状与未来趋势探讨 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI生成内容&#xff08;AI-Generated Content&#xff0c;AIGC&#xff09;成为了一项颠覆性的技术&#xff0c;它能够自动生成文本、图像、音频和视频等多种内容。本文将…

示例:推荐一个基于第三方QRCoder.Xaml封装的二维码显示控件

一、目的&#xff1a;基于第三方QRCoder.Xaml封装的二维码控件&#xff0c;为了方便WPF调用 二、效果如下 功能包括&#xff1a;背景色&#xff0c;前景色&#xff0c;中心图片设置和修改大小&#xff0c;二维码设置等 三、环境 VS2022 四、使用方式 1、安装nuget包&#xf…

数据可视化期末总结

期末考试重点&#xff08;世界上最没意义的事情&#xff09; 选择 p8 数据可视化的标准&#xff1a; 实用、完整、真实、艺术、交互&#xff08;性&#xff09; p21 色彩三属性 色相、饱和度、亮度 p23 视觉通道的类型&#xff1a; 记得色调是定性 p39 散点图&#xff08;二维…

Kotlin 运行代码片段多种方式

目录 场景描述 一、Scratch files and worksheets in the IDE 1、Scratch files(草稿文件) 特点&#xff1a; Scratch files文件创建步骤&#xff1a; 功能解释&#xff1a; Scratch Buffer笔记文件&#xff1a; 2、Worksheets(工单) 1&#xff09;、创建方式不同。 …

国内有哪些比较优秀的wordpress主题?

WordPress作为全球最受欢迎的开源内容管理系统之一&#xff0c;拥有众多优质的主题供用户选择。那么国内有哪些比较优秀的wordpress主题呢&#xff1f;下面小编就和大家分享国内功能比较完善比较受欢迎的wordpress主题。 wordpress主题合集&#xff1a;WP主题-办公人导航https:…

浅析缓存技术

缓存技术的原理 缓存技术通过在内存中存储数据副本来加速数据访问。当应用程序需要数据时&#xff0c;首先检查缓存是否存在数据副本&#xff0c;如果有则直接返回&#xff0c;否则再从原始数据源获取。这种机制大大减少了访问时间&#xff0c;提升了系统的响应速度和整体性能。…

利用Frp实现内网穿透(docker实现)

文章目录 1、WSL子系统配置2、腾讯云服务器安装frps2.1、创建配置文件2.2 、创建frps容器 3、WSL2子系统Centos服务器安装frpc服务3.1、安装docker3.2、创建配置文件3.3 、创建frpc容器 4、WSL2子系统Centos服务器安装nginx服务 环境配置&#xff1a;一台公网服务器&#xff08…

centos7 根目录扩容

1、先检查一下磁盘空间 [rootlocalhost ~]# lsblk 二、使用fdisk创建新分区 [rootlocalhost ~]# fdisk /dev/vdb 1、输入 p &#xff0c;查看当前分区表&#xff1b; 2、输入 n &#xff0c;新建一个分区&#xff1b; 3、再输入 p &#xff0c;选择分区类型为主分区&#x…

智能化改造助力企业高质量发展

引言 背景介绍 在当今全球经济环境中&#xff0c;变化和不确定性已成为常态。企业面临的竞争压力不断增加&#xff0c;市场竞争日益激烈。新兴市场的崛起、技术进步和消费者需求的快速变化&#xff0c;使得传统的商业模式和生产方式面临巨大挑战。为了在这样的环境中保持竞争力…

摄影约拍管理系统

摘 要 摄影约拍管理系统是一种基于SSM框架的系统&#xff0c;旨在为摄影师和用户提供便捷的约拍服务。本文通过对系统的设计与实现&#xff0c;解决了传统约拍方式中存在的信息不对称、预约流程繁琐等问题。本文介绍了系统的研究背景与意义&#xff0c;分析了国内外发展现状&a…

应届毕业之本科简历制作

因为毕设以及编制岗位面试&#xff0c;最近好久没有更新了&#xff0c;刚好有同学问如何制作简历&#xff0c;我就准备将我自己制作简历的流程分享给各位&#xff0c;到此也算是一个小的结束&#xff0c;拿了工科学位证书毕业去做&#x1f402;&#x1f40e;了。 简历主要包含内…

光泽正在褪去,所以我们又回到了人工智能领域。

光泽正在褪去&#xff0c;所以我们又回到了人工智能领域。 人工智能冬天将被私有化 自从“人工智能”这个流行词在20世纪50年代被创造出来以来&#xff0c;人工智能经历了几次繁荣和萧条周期。 一种新的技术方法看起来很有趣&#xff0c;并取得了一些成果。它被荒谬地炒作并获…