YAOI Round #1 (Div.2) 题解
总体来说很有一定区分度的(主要分为 4 题、2 题、1 题几档),ACM 赛制也挺有意思的,征求一下大家对这场比赛的意见吧,可以在这个帖子下回复,我都会看的。
简要题解:(
A. 云之彼端,约定的地方
解法:
本题是拓扑学中的欧拉公式的结论题。
我们发现 \(V=E-F+2\) ,于是便得到了答案。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int e,f;
scanf("%d%d",&e,&f);
printf("%d",e-f+2);
return 0;
}
B. 秒速 5 厘米
考点: 欧几里得法,裴蜀定理,简单数论/构造。近年来考试对数论的考察(如17、18年)都有所加深,今年更是考了一道构造题。
题解: 要使所有的数清零,也就是要使方程 \(len1 \times x + len2 \times y + len3 \times z + X = 0\) 这个方程一定有解。联想到裴蜀定理:\(ax+by=c\)有解当且仅当 \(\gcd(x,y) | c\),当 \(a\)、\(b\) 互质的时候这个方程一定有解。所以我们第一次操作修改 \(1\)$n$,第二次修改$1$\(n-1\),第三次修改\(n\)。由于 \(n\) 和 \(n-1\) 互质,前两次一定存在方法使两次之和加上原数等于 \(0\),而最后一次操作能使最后一个数清零。
具体构造方案就变成了解方程 \(nx + (n-1)y = C\) 的任意一组解,不管是交给小学奥数还是交给拓展欧几里得都是可以的。
这题的构造其实不难想到,当然观察样例也可以发现,可以说观察样例是极其重要的能力。
标程: (来自 liyiming,我自己是用拓欧写的,放这个比较友好。)
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
cout << 1 << " " << n - 1 << endl;
cout << a[1] * (n - 1);
for (int i = 2; i <= n - 1; i++) cout << " " << a[i] * (n - 1);
cout << endl;
cout << 1 << " " << n << endl;
for (int i = 1; i <= n - 1; i++) cout << -a[i] * n << " ";
cout << 0 << endl;
cout << n << " " << n << endl;
cout << -a[n];
cout << endl;
return 0;
}
C. 追逐繁星的孩子
解法:
对于这棵树,从 \(1\) 号节点开始进行一次 \(\text{dfs}\) ,并在过程中计算经过该点的概率即可。
当然,如果当前概率已经不合法,则可以剪枝优化。
代码:
#include <bits/stdc++.h>
#define Re register
using namespace std;
const int maxn=500005;
vector<int> T[maxn],E[maxn];
int n,q,cnt;
void dfs(int x,int fa,long double p)
{
if(p*100<q) return;
cnt++;
for(Re int i=0;i<T[x].size();i++)
{
if(T[x][i]==fa) continue;
dfs(T[x][i],x,p*E[x][i]/100);
}
}
int main()
{
scanf("%d%d",&n,&q);
for(Re int i=1;i<n;i++)
{
int u,v,p;
scanf("%d%d%d",&u,&v,&p);
T[u].push_back(v);
T[v].push_back(u);
E[u].push_back(p);
E[v].push_back(p);
}
dfs(1,1,1.0);
printf("%d",cnt);
return 0;
}
D. 言叶之庭
标程:
int n; cin >>n;
for (int i = n - 1; i >= 0; i--)
{
f[i] = f[i+1] + (double)n / ((double)n - i);
g[i] = g[i+1] + (double)i / ((double)n - i) * f[i]+ f[i+1] + (double)n / ((double)n - i);
}
printf("%.2lf",g[0]);
考点: 期望相关知识,可以说期望是一个大难点,如何逾越它是个重要的问题。
题解: 这题的期望还是很巧妙的。
设 \(f_{i}\) 表示已经买到了 \(i\) 张不同的邮票的期望步数,\(g_{i}\) 表示表示已经买到了 \(i\) 张不同的邮票的期望花费;\(h_{i}\) 表示已经买到了 \(i\) 张不同的邮票、想买下剩下邮票的期望步数,\(y_{i}\) 表示表示已经买到了 \(i\) 张不同的邮票、想买下剩下邮票的期望花费。
我们可以得到一些好玩的式子们,有一些是对的,有一些是错的:
\]
这个式子是对的,为什么呢?我抽到新邮票的概率是 \(\frac{n-i+1}{n}\),那么抽到新邮票的期望次数就是 \(\frac{n}{n-i+1}\)。上述式子甚至可以写成 $ f_n = \sum\limits { \frac{1}{i} } $。
\]
这个式子显然是错的。为什么呢?有两种解释方法,一是每种 \(f_n\) 的取值的贡献不是一样的,不满足线性性;也可以看做是 \(\mathbb{E}(x^2)\) 作为不独立的两个变量相乘,不具有线性性。
\]
这个式子又是对的了,这个成立就能得到一些很好玩的式子,比如 $ f_{n} = \sum\limits_{i=1}^{n}(\frac{n}{i} \sum\limits_{j=1}^{i}(\frac{n}{i})) $。
\]
这个来源于分类讨论,两种情况分别讨论一下,移项一下就能得到递推式。
\]
和上面的方程的来源是一样的,但是需要用到费用提前计算——\(h_i+1\) 的含义是替后面的提前加上。但这个式子还是有一些难以解释通的地方,为什么递归下去后每次提前计算的贡献是相同的?那不是成了平行四边形吗?这个方法使得期望满足了线性性——竖着我统计没有线性性,横过来看就能巧妙地去掉乘积项,就拥有了线性性。
更为不严谨的方程: 设买了 \(x\) 次邮票,答案就是 \(\frac{x+x^2}{2}\)。设 \(w_i\) 表示已经买到了 \(i\) 种邮票、要买剩下的的邮票的次数平方的期望(注意和期望的平方的区别),那么可以得到
\]
于是答案就是 \(\frac{h_0 + w_0}{2}\)。但是——这么做是有问题的——因为默认了平方的期望等于期望的平方!但是,他居然是对的!错的做法能过,说明过的做法都是错的,细思极恐啊!
E. 你的名字
考点: 组合数学,计数问题。计数问题是福建省选的黄金考点,六题能出四道计数。
题解: 使用 Burnside 引理(\(cnt = \frac{1}{|G|}\sum\limits \chi (x)\))或者简单的容斥可得 \(ans=\frac{2 \times 2^{\frac{n^2}{4}} + 2^{\frac{n^2}{2}} + 2^{n^2}}{4}\),下面讨论如何计算这个值。
2 的那么多次方可以使用快速幂计算;由于指数远远超出了 long long 范畴,所以考虑怎么把指数变小。由费马小定理得 \(2^{p-1} \equiv 1 (mod p)\),所以 \(2^{k} \equiv 2^{k mod (p-1)} (mod p)\);所以只需计算 \(n^2 mod (p-1)\);这个东西远远超过 long long,要计算它的取模,可以使用这个小技巧:
inline ll ksc(ll x, ll y, ll p){
ll z = (ld)x / p * y;
ll res=(ull)x * y - (ull)z *p ;
return (res + p) % p;
}
标程:
cout << (2 * 1ll * qpow(2, ksc(n / 2, n / 2, mod - 1)) +
qpow(2, ksc(n / 2, n, mod - 1)) + qpow(2, ksc(n, n, mod - 1)))
% mod * 1ll * inv4 % mod << endl;
F. 天气之子
考点: 计数问题,树论,树论是 noip / CSP 的几乎最重要的考点。
题解: 这种方法叫做 贡献 法,考虑一个连通块在那些 \([l,r]\) 中出现过;那么我们需要取其中一个点作为这个连通块的代表,那么我就取深度最浅的那个点作为连通块的代表结点。于是我们枚举每个结点作为连通块的最浅结点,显然它能作为最浅结点当且仅当它的父节点没有被取到,当它的父节点被取到时,它就不是最浅借点,也可以认为这个连通块它不存在。于是我们快乐地得到如下代码:
标程:
u64 ans = 0;
for (int i = 2; i <= n; i++)
{
if (fat[i] < i)
{
ans += (i - fat[i]) * 1ll * (n - i + 1);
}
else
{
ans += (fat[i] - i) * 1ll * i ;
}
}
YAOI Round #1 (Div.2) 题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- 喵哈哈村的魔法考试 Round #2 (Div.2) 题解
喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解
喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
随机推荐
- 240.搜索二维矩阵II
从左下角位置开始搜索 时间复杂度:O(行数+列数). 想法有点像二分法,大了往一个方向找,小了往另一个方向找.由于矩阵横向和纵向都是递增,如果从(0,0)位置开始找,往右和往下都是增大,因此不知道实际 ...
- JVM:类加载与字节码技术-2
JVM:类加载与字节码技术-2 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 这部分内容在上一篇笔记中: 类文件结构 字节码指令 编译期处理 类加载阶段 ...
- [no_code][Beta]测试报告
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 测试报告 我们在这个课程的目标是 设计出一个OCR表单处理软件 这个作业在哪个具体方面 ...
- [no_code]OCR表格处理——技术规格说明书
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 技术规格说明书 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体方面 ...
- Linux Ubuntu stty 使用
stty(set tty)命令用于显示和修改当前注册的终端的属性. 该命令是一个用来改变并打印终端行设置的常用命令. stty -a #将所有选项设置的当前状态写到标准输出中 old_stty_set ...
- JavaScript 对象:String & Array 及其常见应用
String对象 split 功能:把字符串分割为字符串数组.官方文档已经描述的够清楚,不多赘述.主要说一下需要注意的情况以及应用 1.省略分割参数 var str="How are you ...
- CommonJS与ES6 Module的使用与区别
CommonJS与ES6 Module的使用与区别 1. CommonJS 1.1 导出 1.2 导入 2. ES6 Module 2.1 导出 2.2 导入 3. CommonJS 与 ES6 Mo ...
- storm调用kafka重复消费的问题
1. 实现IBolt接口的bolt需要显式调用collector.ack(); 2. 继承自BaseBasicBlot的bolt, 会帮你自动调用ack的
- 运行脚本 结果出现 Vim: Warning 并且卡住不能输入其它命令
当我在执行一个 关于执行linux操作的php脚本时,就出现了以下信息:"Vim: Warning: Output is not to a terminal",接着出现了一大堆的字 ...
- 【JavaScript定时器小案例】常见的几种定时器实现的案例
[JavaScript定时器小案例]常见的几种定时器实现的案例 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 在日常开发 ...