CF1469D Ceil Divisions 题解
Content
你有一个长度为 \(n\) 的数组 \(a\),初始时,\(\forall i\in[1,n]\),\(a_i=i\)。
每次操作选择两个数 \(x,y(1\leqslant x,y\leqslant n,x\neq y)\),然后将 \(a_x\) 转换为 \(\left\lceil\dfrac{a_x}{a_y}\right\rceil\)。你需要执行不超过 \(n+5\) 次操作将数组 \(a\) 转换为一个包含 \(n-1\) 个 \(1\) 和 \(1\) 个 \(2\) 的数组。请给出一个构造方案。
数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 10^3\),\(3\leqslant n,\sum n\leqslant 2\times 10^5\)。
Solution
不难想到的做法是,\(\forall i\in[3,n)\),每次将 \(a_i\) 转换为 \(\left\lceil\dfrac{a_i}{a_{i+1}}\right\rceil\)。可以证明,由于 \(a_i<a_{i+1}\),所以转换的结果必然为 \(1\)。然后我们再用剩下的 \(2\) 不断的去除 \(n\) 直到 \(n\) 变成 \(1\) 为止。操作数约为 \(n+\log n\),而 \(\log n\) 最大值显然会超过 \(5\),因此是不可行的。考虑如何优化这个操作方案。
我们发现,拿 \(\left\lceil\sqrt{n}\right\rceil\) 去除 \(n\) 最多仅需 \(2\) 次就可以将 \(n\) 变成 \(1\),因此,我们不妨把 \([\left\lceil\sqrt{n}\right\rceil,n]\),\([\left\lceil\sqrt{\left\lceil\sqrt{n}\right\rceil}\right\rceil,\left\lceil\sqrt{n}\right\rceil]\),\(\dots\) 等部分分成一段(注意 \(1,2\) 不能被分到任何一段中去),对于每一段,我们先把中间的所有元素全拿最后一个元素去除使它门全部都变成 \(1\),然后再去拿最左边的元素去除以最右边的元素 \(2\) 次,即可做到使一段里面的元素全部变成 \(1\)。
然后这道题目就可以过了。
Code
namespace Solution {
const int N = 2e5 + 7;
int n;
struct node {int x, y;};
vector<node> ans;
ii checksq(int x) {
int sqrtx = sqrt(x);
return sqrtx * sqrtx == x;
}
iv Main() {
MT {
read(n), ans.clear();
int cur = sqrt(n) + !checksq(n), precur = n, fl = 0;
while(precur > 2) {
F(int, i, cur + 1, precur - 1) ans.push_back((node){i, precur});
F(int, i, 1, 2) ans.push_back((node){precur, cur});
precur = cur, cur = sqrt(precur) + !checksq(precur);
}
int cnt = ans.size(); println(cnt);
F(int, i, 0, cnt - 1) printf("%d %d\n", ans[i].x, ans[i].y);
}
return;
}
}
CF1469D Ceil Divisions 题解的更多相关文章
- 1644 免费馅饼 题解(c++)(S.B.S.)
1644 免费馅饼(巴蜀oj上的编号) 题面: SERKOI最新推出了一种叫做“免费馅饼”的游戏. 游戏在一个舞台上进行.舞台的宽度为W格,天幕的高度为H格,游戏者占 ...
- POJ 2585 Window Pains 题解
链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...
- 「CF#554 div2」题解
A 水题一道. 题目的大致意思就是:给你两个集合,求集合间有多少数对和是奇数. 题解,开\(4\)个桶后,求一个\(min\)就可以了. #include <bits/stdc++.h> ...
- 算法(第四版)C# 习题题解——3.1
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...
- HAOI2017 简要题解
「HAOI2017」新型城市化 题意 有一个 \(n\) 个点的无向图,其中只有 \(m\) 对点之间没有连边,保证这张图可以被分为至多两个团. 对于 \(m\) 对未连边的点对,判断有哪些点对满足将 ...
- SCOI2016 Day2 简要题解
「SCOI2016」妖怪 题意 有 \(n\) 只妖怪,每只妖怪有攻击力 \(\text{atk}\) 和防御力 \(\text{dnf}\) ,在环境 \((a, b)\) 下,它可以把攻击力和防御 ...
- SCOI 2015 Day1 简要题解
「SCOI2015」小凸玩矩阵 题意 一个 \(N \times M\)( $ N \leq M $ )的矩阵 $ A $,要求小凸从其中选出 $ N $ 个数,其中任意两个数字不能在同一行或同一列, ...
- leetcode & lintcode 题解
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
随机推荐
- python的基础知识-冷门
可变与不可变: 大部分python对象是可变的,e.g列表,字典,自定义的类. 字符串和元祖是不可变的. pass用于占位符,py不允许有空代码块 range和xrange 生成整数列表 xrange ...
- 如何删除一个win10的服务
使用场景: 之前电脑玩腾讯qq微端游戏,后来卸载残留服务一直在后台占用系统资源.那么如何关闭这个服务呢. 1.首先 管理员运行--cmd.exe 2.打开任务管理器,找到服务名称,如果服务开启可以关闭 ...
- setoolkit的钓鱼实验
1.在kali中打开setoolkit 2.在菜单中选择第一个进入社会工程学攻击 3.选择第二个模块属于网站攻击向量 4.选择第五个模块,进行web劫持攻击 5.选择第二个,进行网站克隆 6.发现访问 ...
- JavaScript Sanitizer API:原生WEB安全API出现啦
10月18号, W3C中网络平台孵化器小组(Web Platform Incubator Community Group)公布了HTML Sanitizer API的规范草案.这份草案用来解决浏览器如 ...
- CF1264D1 Beautiful Bracket Sequence (easy version)
考虑在一个确定的括号序列中,我们可以枚举中间位置,按左右最长延伸出去的答案计算. 我们很自然的思考,我们直接维护左右两边,在删除一些字符后能够延伸的最长长度. 我们设\(f_{i,j}\)为\(i\) ...
- [linux] mv: cannot move $ to $: Directory not empty
最近测试某流程时,跑的过程报错了,于是检查脚本修改后重新测试.脚本是改过来了,但在shell中运行某步时碰到了如题报错! $ mv MP_genus_network_files/ tax_networ ...
- R语言与医学统计图形-【16】ggplot2几何对象之标签与文本
ggplot2绘图系统--添加标签与文本.数学表达式.条形图文本.注释 1. 文本与标签添加 geom_label的文本将以标签形式出现,即文本会带有一个背景色. geom_text则是纯文本形式展示 ...
- 问题记录:SNP 标记 phasing
GATK4 检测的SNP标记,有些位点会在检测过程中完成 phasing,在后续做基因型填充的时候有坑. GATK4 phasing 结果的缺失位点不是 ./. 也不是 .|. 而是直接变成一个单独 ...
- Linux—find在指定路径下查找文件或目录
find /指定路径 -name "*filename*" find /指定路径 -name "*filename*" 2>/dev/null ...
- 在 vscode.dev 中直接运行 Python !纯浏览器环境,无后端!
其实有挺长一段时间没有写自己的 VS Code 插件了! 还是要感谢我们 DevDiv 组的 Flexible Friday 活动,让我可以在工作日研究自己感兴趣的项目. Flexible Frida ...