目录/题目列表
注:本题解仅供参考题解中所有代码均省略头文件,以及添加了宏定义#define int long long
代码中std::可以去掉,只要加上“using namespace std;”就行。
G题与并查集维护相关的知识点为并查集的重点!
如果有疑问欢迎评论或找本人询问
A 神仙说他也不懂(签到/模拟)
题面:
思路:
按题目的信息,奇数位的字符串输出第0位,偶数位的字符串输出第1位即可。
AC代码:
void solve() { int n; std::string s; std::cin >> n; for (int i = 1; i <= n; i++) { std::cin >> s; if (i % 2) std::cout << s[0]; else std::cout << s[1]; } }
B 树状数组(模拟)
题面:
思路:
原本这题其实是前缀和,但想了想也没啥新颖的改法,于是变成普通的遍历求和做法,只需注意保留小数就可以
根据动量守恒:m1v1=(m1+m2)v2 就可以求出结果,并且注意题目要求的是第i个小球
AC代码:
void solve() { int n, v, q; std::cin >> n >> v >> q; std::vector<int> a(n + 1, 0LL); for (int i = 1; i <= n; i++) { std::cin >> a[i]; a[i] += a[i - 1]; } std::cout << std::fixed << std::setprecision(2) << a[1] * v * 1.0 / (a[q]); }
C 回滚莫队(思维)
题面:
思路:
先看每个Ai代表什么,代表的是相邻两位的和。
由提示给出的表盘可知,转n次正好能转一圈;
那么A数组就包含了a1+a2,a2+a3,……,an-1+an,a1+an(a代表表盘上原本的数字),
所以A数组的总和,即A1+A2+......An,就等于2 *(a1+a2+.......+an)。
那么平均数就很好求了
这道题过程中可能会爆long long,所以#define int long long 是个好习惯(仅打比赛上的)
AC代码:
void solve() { int n; std::cin >> n; int sum = 0; for (int i = 1; i <= n; i++) { int x; std::cin >> x; sum += x; }