Codeforces Round #701 (Div. 2) A~C 题解
写在前边
链接:Codeforces Round #701 (Div. 2)
数学场,题目描述简单粗暴,思路很妙,代码短的不行,都是好神奇的一些题目。
A. Add and Divide
链接:A题链接
题目大意:
给定两个正整数,我们可以进行两个操作:
- \(a = \lfloor \frac{a}{b} \rfloor\)
- \(b = b + 1\)
最终目标是找到使\(a\)变成\(0\)的最小操作次数
思路:
因为\(b\)每次只会变动\(1\),所以最开始思路就是,如果我们可以提前大体找到一个操作次数,我们在这个操作次数内进行枚举,而\(b\)每次操作只会变动\(1\),所以假设一共有\(sum\)次操作,如果我们可以有\(n\)次让\(b\)加\(1\),然后\(b\)变成了\(b + n\),然后让\(a\)不断的除\(b\)直到为\(0\),假设有\(m\)次操作,那么答案就是\(m + n\)次操作了,那么怎么才能找到这个\(sum\)呢,可以看数据范围,我们可以估计最差的情况,最差的情况就是当\(b=1,a = 10^9\)的时候,这时候我们首先要做的就是让\(b + 1\),然后再让\(a\)不断的除\(b\),直到为\(0\),而这最多需要\(\lfloor log_2(10^9) \rfloor = 29\)次,所以!经过分析最差情况也就进行\(30\)次操作左右,即\(m + n < 31\)所以我们只需要枚举到\(31\)即可,最坏情况\(O(log^2a)\)
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
using namespace std;
#define Inf 0x3f3f3f3f
#define PII pair<int, int>
#define P2LL pair<long long, long long>
#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<long long> VLL;
typedef vector<int> VI;
void solve() {
int a, b, res = 35;
cin >> a >> b;
if (a < b) {
puts("1");
return;
}
for (int i = (b == 1 ? 1 : 0); i <= 30; i++) { //枚举多少次 最坏情况下就有30次
int tempa = a, tempres = i;
int tempb = b + i;
while (tempa) {
tempa /= tempb;
tempres++;
}
res = min(res, tempres);
}
cout << res << endl;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t;
scanf("%d", &t);
while (t--) {
solve();
}
system("pause");
return 0;
}
B. Replace and Keep Sorted
链接:B题链接
题目大意:
定义两个互为\(k-similar\)的数组:
- 都是严格单调递增
- 有相同的长度
- 它们的元素范围\(\in [1, k]\)
- 它们只有一个数不同。
现在给定一个数组\(a\),并且给定一个区间\([l,r]\),那么\(k-similar\)中的一个数组\(b_1\)就是\([a_l, a_{l + 1}, ... , a_r]\),长度为\(len = l - r + 1\) 那么另一个\(k-similar\)数组\(b_2\)就是可以从\([1, k]\)中选\(len\)个数,并且只与\(b_1\)有一个数不同的数组,问有多少个这样的数组\(b_2\)。
思路:
首先想到可以挨个枚举每一个位置可以选多少个数,那么最终答案就是每一个位置可以选的数之和,但是这样数据范围就是\(O(q*n)\)明显会超时,所以就想能不能在\(O(1)\)复杂度之内就能判断出一个区间中所有的可能,第\(l\)个位置的数可以选\(a[l + 1] - 2\)个,第\(r\)个位置的数可以选\(k - a[r - 1] - 1\)个,对于\((l,r)\)(注意是开区间!)能选多少个我们可以用前缀和处理,前缀和就是每一个区间可以选择的数的个数,时间复杂度就降为了\(O(q)\).
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
using namespace std;
#define Inf 0x3f3f3f3f
#define PII pair<int, int>
#define P2LL pair<long long, long long>
#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<long long> VLL;
typedef vector<int> VI;
const int N = 1e5 + 10;
int a[N], b[N];
void solve() {
int n, k, q;
scanf("%d%d%d", &n, &q, &k);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
a[n + 1] = k + 1;
for (int i = 1; i <= n; i++) {
b[i] += a[i + 1] - a[i - 1] - 2;
b[i] += b[i - 1];
}
while (q--) {
LL res = 0;
int l, r;
scanf("%d%d", &l, &r);
res += b[r - 1] - b[l]; //开区间
res += k - a[r - 1] - 1; //右边
res += a[l + 1] - 2; //左边
printf("%d\n", res);
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
solve();
return 0;
}
C. Floor and Mod
链接:C题链接
题目大意:
给定下下\(x,y\),现在要求求一个数对\((a, b)\),使得\(\lfloor \frac{a}{b} \rfloor = a \,\, mod \,\, b\), 要求\(a \in [1, x]\), \(b \in [1, y]\)。
思路:
首先暴力肯定不行,所以想能不能用\(O(1)\)直接求出来,那只要推公式了,让\(\lfloor \frac{a}{b} \rfloor = a \,\, mod \,\, b = k\),所以推出\(a = k*b + k(b > k)\),又因为\(b > k\),可以推出\(k^2 < k*b+k = a \leq x\),所以\(k \leq \sqrt{x}\),所以现在求出了\(k\)的范围\(k \in [1, \sqrt{x}\,]\),现在要做的就是对于每一个固定的\(k\),如果我们可以推出\(a\)或者\(b\)数的范围,那么就可以求出数对\((a, b)\)可取的个数了,对于b,已知\(b > k\), \(1 \geq b \leq y\),根据 \(k*b+k = a \leq x\),得出\(b \leq x / k - 1\),因此得出\(b\)的个数就是\(max(0, min(y, x / k - 1) - k)\)。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
using namespace std;
#define Inf 0x3f3f3f3f
#define PII pair<int, int>
#define P2LL pair<long long, long long>
#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<long long> VLL;
typedef vector<int> VI;
void solve() {
LL x, y;
cin >> x >> y;
LL res = 0;
for (LL k = 1; k * k <= x; k++) {
res += max(0LL, min(y, x / k - 1) - k);
}
cout << res << endl;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t;
scanf("%d", &t);
while (t--) {
solve();
}
system("pause");
return 0;
}
Codeforces Round #701 (Div. 2) A~C 题解的更多相关文章
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- Codeforces Round #198 (Div. 2)A,B题解
Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...
- Codeforces Round #672 (Div. 2) A - C1题解
[Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...
- Codeforces Round #701 (Div. 2) 题解
由于今天实在是太自闭了就前来写场已经 AK 的 div.2 的题解了 这场比赛是我的 div.2 首 AK 哦 A 先特判 \(b=1\),强制将 \(b+1\) 否则容易发现答案最大为 \(\log ...
- Codeforces Round #614 (Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...
- Codeforces Round #610 (Div. 2) A-E简要题解
contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...
- Codeforces Round #611 (Div. 3) A-F简要题解
contest链接:https://codeforces.com/contest/1283 A. Minutes Before the New Year 题意:给一个当前时间,输出离第二天差多少分钟 ...
- Codeforces Round #499 (Div. 2) D. Rocket题解
题目: http://codeforces.com/contest/1011/problem/D This is an interactive problem. Natasha is going to ...
- Codeforces Round #499 (Div. 2) C Fly题解
题目 http://codeforces.com/contest/1011/problem/C Natasha is going to fly on a rocket to Mars and retu ...
- Codeforces Round #198 (Div. 2)C,D题解
接着是C,D的题解 C. Tourist Problem Iahub is a big fan of tourists. He wants to become a tourist himself, s ...
随机推荐
- Blazor前后端框架Known-V1.2.8
V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...
- 【工具推荐】github打不开or加载慢?不用配置hosts,教你一键加速!
不说废话 下载watt toolkit(原名steam++) 官方地址: Watt Toolkit - 瓦特工具箱(Steam++官网) (steampp.net) 安装完后选中,点击一键加速即可. ...
- DBSCAN聚类
一.概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,簇集的划定完全由样本的聚集 ...
- 自治系统/自治域和自治系统编号(ASN)
定义: 自治系统或自治域(英文:Autonomous system, AS)是指在互联网中,一个或多个实体管辖下的所有IP网络和路由器的组合,它们对互联网执行共同的路由策略.参看RFC 1930中更新 ...
- Android-JAR包的引用
一.JAR的定义 JAR文件(Java归档,英语:Java Archive)是一种软件包文件格式,以ZIP格式构建,以.jar为文件扩展名,通常用于聚合大量的Java类文件.相关的元数据和资源 ...
- MIPS寄存器堆
实验目的 熟悉并掌握 MIPS 计算机中寄存器堆的原理和设计方法 理解源操作数/目的操作数的概念 实验环境 Vivado 集成开发环境 MIPS寄存器 寄存器R0的值恒为0. 模块接口设计 1个写端口 ...
- vue3 甘特图(二):甘特图时间轴切换
vue3 甘特图(二):gantt时间轴切换 1.固定时间轴缩放级别 gantt.config.scale_unit = "month"; //时间轴单位 gantt.config ...
- c语言代码练习15
//使用togo跳转代码,阻止关机#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> ...
- MySQL innoDB 间隙锁产生的死锁问题
背景 线上经常偶发死锁问题,当时处理一张表,也没有联表处理,但是有两个mq入口,并且消息体存在一样的情况,频率还不是很低,这么一个背景,我非常容易怀疑到,两个消息同时近到这一个事务里面导致的,但是是偶 ...
- Go语言常用标准库——log、net_http、strconv、time包
文章目录 log 使用Logger 配置logger 标准logger的配置 flag选项 配置日志前缀 配置日志输出位置 创建logger 总结 net_http net/http介绍 HTTP协议 ...