# Codeforces Round 1011 (Div. 2) 部分题题解

news/2025/3/25 0:10:42/文章来源:https://www.cnblogs.com/acmerbs/p/18787797

Codeforces Round 1011 (Div. 2)

A.Serval and String Theory

思路分析

本题可以分情况讨论。
设当前字符串为 \(s\),反转后的字符串为 \(t\)

  • 字符串只有 \(1\) 种字符,那么 \(s = t\) 一定成立
  • \(s \geq t\)
    • \(m = 0\),那么无法交换字符使得 \(s < t\)
    • \(m > 0\), 可以通过一次交换,得到 \(s < t\)
  • \(s < t\) 不用任何操作,就满足 \(s < t\)

代码

#include <bits/stdc++.h>// #define int long long
#define PII pair<int,int>
#define endl "\n"
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define sz(x) (int)x.size()
#define rd(x, y) rand() % (y - x + 1) + x
#define ls u << 1
#define rs u << 1 | 1
using namespace std;const int N = 300010;
int a[N], n, m, k;void solve(){cin >> n >> m;string s, t;cin >> s;t = s;map<char,int>mp;for(auto it : s){mp[it] ++;}reverse(all(t));if(mp.size() == 1 || (!m && s >= t)) cout << "NO\n";else cout << "YES\n"; 
}signed main(){int tt = 1;cin >> tt;while(tt -- ){solve();}return 0;
}

B Serval and Final MEX

思路分析

考虑 \(0\) 的个数 cnt 和在字符串的存在的位置。

  • cnt = 0,直接选择区间 \([1, n]\)

  • \(a[1] = a[n] = 0\),那么依次选择区间 \([1, 2], [n - 2, n - 1], [1, 2]\)

  • cnt = 1,分情况讨论,设0的下标为 \(idx\)

    • \(idx != 1\),选择区间\([idx - 1, idx], [1, n - 1]\)
    • \(idx != n\) ,选择区间\([idx, idx + 1], [1, n - 1]\)
  • 其余情况,直接把所有 \(0\) 所在区间合并一次,再合并一次整个序列即可。

代码

#include <bits/stdc++.h>// #define int long long
#define PII pair<int,int>
#define endl "\n"
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define sz(x) (int)x.size()
#define rd(x, y) rand() % (y - x + 1) + x
#define ls u << 1
#define rs u << 1 | 1
using namespace std;const int N = 300010;
int a[N], n, m, k;void solve(){cin >> n;int cnt = 0;vector<int>q;for(int i = 1; i <= n; i ++ ){cin >> a[i];if(a[i] == 0){cnt ++;q.pb(i);} }vector<PII>ans;if(a[1] == 0 && a[n] == 0){ans.pb({1, 2});ans.pb({2, n - 1});ans.pb({1, 2});}else{if(cnt == 0){ans.pb({1, n});}else{if(cnt == 1){if(q[0] - 1 >= 1){ans.pb({q[0] - 1, q[0]});ans.pb({1, n - 1});}else{ans.pb({q[0], q[0] + 1});ans.pb({1, n - 1});}}else{ans.pb({q[0], q[cnt - 1]});ans.pb({1, n - (q[cnt - 1] - q[0])});}}}cout << ans.size() << endl;for(auto [x, y] : ans){cout << x << " " << y << endl;}
}signed main(){int tt = 1;cin >> tt;while(tt -- ){solve();}return 0;
}

C - Serval and The Formula

思路分析

比赛的时候没有发现结论,构造做的。

性质

1.要满足题目中的式子,那么 \(x + k\)\(y + k\)的二进制中的 1 的位置要错开。

2.\(x = y\),无法构造,输出 -1

构造

1.从低位到高位去遍历 \(x, y\)的二进制数,记录离当前这一位最近的\(x\)\(y\) 在某一位二进制数不同的位置last

2.假设当前\(x\)\(y\) 的第 \(i\) 位都是 \(1\),我们可以对 \(x\)
\(y\) 都加上 \(2^{last} + 2^{last + 1} +…… 2^{i - 1}\),来把 \(x\)\(y\) 的第 \(i\) 位变成不一样,然后不断的更新 last

3.如果一开始 \(x\) 的最低位和 \(y\) 的最低位都不一样。那么就一直加 \(2^i\),直到出现第一个不一样的位置为止。

代码

#include <bits/stdc++.h>#define int long long
#define PII pair<int,int>
#define endl "\n"
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define sz(x) (int)x.size()
#define rd(x, y) rand() % (y - x + 1) + x
#define ls u << 1
#define rs u << 1 | 1
using namespace std;const int N = 300010;
int a[N], n, m, k, qmi[70];void solve(){int x, y;cin >> x >> y;int ans = 0;if(x == y){cout << "-1\n";}else{int last = -1;int cnt = 0;while(x + y != (x ^ y)){cnt ++;for(int i = 0; i <= 60; i ++ ){if((x >> i & 1) != (y >> i & 1)){last = i;}if(x >> i & 1){if((x >> i & 1)  == (y >> i & 1)){if(last == -1){//一开始没有找到二进制位不同的时候ans += qmi[i];x += qmi[i];y += qmi[i];break;}else{//从last + 到i - 1int sum = 0;for(int j = last; j <= i - 1; j ++ ) sum += qmi[j];x += sum;y += sum;ans += sum;break;}}}}}cout << ans << endl;}
}signed main(){int tt = 1;qmi[0] = 1;for(int i = 1; i <= 60; i ++ ) qmi[i] = qmi[i - 1] * 2;cin >> tt;while(tt -- ){solve();}return 0;
}

D - Serval and Kaitenzushi Buffet

思路分析

本题考虑最多(拿 + 吃)多少盘Buffet,很明显是\(\lfloor \frac{n} {k + 1} \rfloor\)。要想吃的最多,尽可能拿的最多,所以我们每次在每一次拿Buffet的截止时间的时候去拿之前遍历过的且没有拿的且满意度最大的即可,有一个堆或者multiset维护一下即可。

代码

/*
拿需要1个单位时间
吃需要k个单位时间
所以一共可以拿 n / (k + 1) 次,那么贪心的在每次拿的最后截止时间去拿之前遍历过的但是没吃的即可
*/
#include <bits/stdc++.h>#define int long long
#define PII pair<int,int>
#define endl "\n"
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define sz(x) (int)x.size()
#define rd(x, y) rand() % (y - x + 1) + x
#define ls u << 1
#define rs u << 1 | 1
using namespace std;const int N = 300010;
int a[N], n, m, k;void solve(){cin >> n >> k;for(int i = 1; i <= n; i ++ ){cin >> a[i];}multiset<int>s;int ans = 0;for(int i = 1; i <= n; i ++ ){s.insert(a[i]);if((n - i + 1) % (k + 1) == 0){ans += *s.rbegin();s.erase(s.find(*s.rbegin()));}}cout << ans << endl;
}signed main(){int tt = 1;cin >> tt;while(tt -- ){solve();}return 0;
}

E. Serval and Modulo

思路分析

性质

1.假设当前\(a_1 \% k = b_1, a_2 \%k = b_2…… a_n \% k = b_n\),那么有 \(a_1 - b_1, a_2 - b_2, …… a_n - b_n\) 都是 \(k\) 的倍数。

2.\(b\)数组是打乱的,所以我们只能推出另一个性质 \(\sum_{i =1}^n a_i - \sum_{i =1}^n b_i\)\(k\) 的倍数。

\(m\) = \(\sum_{i =1}^n a_i - \sum_{i =1}^n b_i\)

根据性质\(2\),我们可以很快想到去枚举 \(m\) 的因子,然后依次检查是否和法即可。

判断是否合法:用 stl 会超时,可以通过排序来依次判断每一位是否相等,因为 \(n\) 是比较小的。

特殊情况

如果\(a\)数组排好序以后 和 \(b\) 数组一样的话,直接挑一个很大的数即可。

#include <bits/stdc++.h>#define int long long
#define PII pair<int,int>
#define endl "\n"
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define sz(x) (int)x.size()
#define rd(x, y) rand() % (y - x + 1) + x
#define ls u << 1
#define rs u << 1 | 1
using namespace std;const int N = 300010;
int a[N], n, m, k, b[N], c[N];bool check(int x){for(int i = 1; i <= n; i ++ ){c[i] = a[i] % x;}sort(c + 1, c + 1 + n);for(int i = 1; i <= n; i ++ ){if(c[i] != b[i]) return 0;}return 1;
}void solve(){cin >> n;mp.clear();for(int i = 1; i <= n; i ++ ) cin >> a[i];for(int i = 1; i <= n; i ++ ){cin >> b[i];mp[b[i]] ++;}sort(a + 1, a + 1 + n);sort(b + 1, b + 1 + n);bool f = 0;for(int i = 1; i <= n; i ++ ){if(a[i] != b[i]){f = 1;break;}}if(!f){cout << 1919810 << endl;return;}int sum = 0;for(int i = 1; i <= n; i ++ ){sum += a[i] - b[i];}k = -1;for(int i = 1; i * i <= sum; i ++ ){//1e5if(sum % i == 0){if(check(i)){k = i;break;}if(sum / i <= 1e9 && check(sum / i)){k = sum / i;break;}}}cout << k << endl;
}signed main(){int tt = 1;cin >> tt;while(tt -- ){solve();}return 0;
}

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

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

相关文章

python第三章课后程序练习题

重量计算 earth_weight = eval(input("请输入你当前的体重(kg)😊) moon_weight = earth_weight * 0.165 for year in range(1, 11): earth_weight += 0.5 moon_weight = earth_weight * 0.165 print(f"Year {year}: Earth weight = {earth_weight}kg, Moon weight …

逆序对的数量 与 归并排序

题目描述 给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足i<j且 a[i]>a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数 n,表示数列的长度。 第二行包含 n 个整数,表示整个数列…

我最常用的 Visual Studio 2022 扩展插件推荐:生产力必备工具

Visual Studio 2022作为微软推出的一款功能强大的IDE,业界称之为“宇宙第一IDE”。它以出色的性能、丰富的内置功能和对多种编程语言的支持,深受开发者喜爱。然而,随着项目复杂度的增加和开发需求的多样化,仅依靠IDE的内置功能往往不足以满足所有场景。这时,扩展插件成为了…

25年可以免费使用的云服务器

免费服务器:调试程序与建站的好帮手网站链接为:https://www.sanfengyun.com/ 在数字化时代,无论是个人开发者、大学生还是时间充裕的技术爱好者,拥有一台稳定的服务器来调试程序和搭建网站都是至关重要的。而正是这样一个为广大用户提供了极大便利的平台,它以其免费的云服…

Code Runner MCP Server,来了!

大家好!我是韩老师。如果作为程序员的你,还不了解 MCP (Model Context Protocol) 的话,那韩老师劝你赶紧去补补课吧!本文不对 MCP 进行详细介绍~ 简单来说,MCP is another LSP in AI World! 也许有一天,AI 程序员不懂 MCP,就犹如前端程序员不懂 JavaScript!大家都知道韩…

Ollama初识

初识ollama,学习基本功能和记录参数前言 最近由于 deepseek 的火爆,AI 大语言模型又一次被抬了出来,对此早有关注的我决定尝试本地化部署使用体验一下,并且搭建一个本地的 AI 助手。 根据我之前了解到的信息,在使用大模型,现在较为方便的方法一般是先搭建一个大模型的管理…

Pass-15

function isImage($filename){//需要开启php_exif模块$image_type = exif_imagetype($filename);switch ($image_type) {case IMAGETYPE_GIF:return "gif";break;case IMAGETYPE_JPEG:return "jpg";break;case IMAGETYPE_PNG:return "png";break…

Pass-16

$is_upload = false; $msg = null; if (isset($_POST[submit])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES[upload_file][name];$filetype = $_FILES[upload_file][type];$tmpname = $_FILES[upload_file][tmp_name];$target_path=UPLO…

upload pass-01

直接上传一句话木马貌似不行,尝试抓包看看发现全是get请求抓不到post传参上传一句话木马的包,合理猜测是不是前段验证,F12禁用JavaScript验证试试看可以看到成功上传并且返回了图片使用phpinfo()命令发现一句话木马成功上传 同理,是不是我们上传一个图片(此时通过了前段白…

# 集美大学课程实验报告-实验3:栈和队列

集美大学课程实验报告-实验2:线性表项目名称 内容课程名称 数据结构班级 网安2411指导教师 郑如滨学生姓名 李斌财学号 202421336021实验项目名称 站和队列上机实践日期上机实践时间 2学时一、目的(本次实验所涉及并要求掌握的知识点) 掌握STL中栈和队列的基本存储结构 掌握…

L3 设计,开发,认证

我都想笑了之十万八千个视频需要看。L3 设计,开发,认证 这里我暂时跳过了那些PPT里面要求看的视频,过一会再整理。 利益相关者和需求 ​ 从图中我们可以得到如下信息:航空器的生命周期:设计——生产——认证——运营 原始设备制造商(original equipment manufacturer,OE…