总体来说很有一定区分度的(主要分为 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\) 张不同的邮票、想买下剩下邮票的期望花费。

我们可以得到一些好玩的式子们,有一些是对的,有一些是错的:

\[f_i = f_{i-1} + \frac{n}{n-i+1}
\]

这个式子是对的,为什么呢?我抽到新邮票的概率是 \(\frac{n-i+1}{n}\),那么抽到新邮票的期望次数就是 \(\frac{n}{n-i+1}\)。上述式子甚至可以写成 $ f_n = \sum\limits { \frac{1}{i} } $。

\[g_n = \frac{f_n(f_n+1)}{2}
\]

这个式子显然是错的。为什么呢?有两种解释方法,一是每种 \(f_n\) 的取值的贡献不是一样的,不满足线性性;也可以看做是 \(\mathbb{E}(x^2)\) 作为不独立的两个变量相乘,不具有线性性。

\[g_i = g_{i-1} + f_i \times \frac{n}{n-i+1}
\]

这个式子又是对的了,这个成立就能得到一些很好玩的式子,比如 $ f_{n} = \sum\limits_{i=1}^{n}(\frac{n}{i} \sum\limits_{j=1}^{i}(\frac{n}{i})) $。

\[h_i = \frac{i}{n}(h_i + 1) + \frac{n-i}{n}(h_{i+1} + 1)
\]

这个来源于分类讨论,两种情况分别讨论一下,移项一下就能得到递推式。

\[y_i = \frac{i}{n}(h_i+y_i+1) + \frac{n-i}{n}(h_{i+1}+y_i+1)
\]

和上面的方程的来源是一样的,但是需要用到费用提前计算——\(h_i+1\) 的含义是替后面的提前加上。但这个式子还是有一些难以解释通的地方,为什么递归下去后每次提前计算的贡献是相同的?那不是成了平行四边形吗?这个方法使得期望满足了线性性——竖着我统计没有线性性,横过来看就能巧妙地去掉乘积项,就拥有了线性性。

更为不严谨的方程: 设买了 \(x\) 次邮票,答案就是 \(\frac{x+x^2}{2}\)。设 \(w_i\) 表示已经买到了 \(i\) 种邮票、要买剩下的的邮票的次数平方的期望(注意和期望的平方的区别),那么可以得到

\[w_i = \frac{i}{n}(w_i + 2h_i + 1) + \frac{n-i}{n}(w_{i+1} + 2h_{i+1} + 1)
\]

于是答案就是 \(\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) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. 喵哈哈村的魔法考试 Round #2 (Div.2) 题解

    喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...

  3. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解

    喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...

  4. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  5. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  6. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  7. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  8. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  9. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

随机推荐

  1. 【UE4 设计模式】适配器模式 Adapter Pattern

    概述 描述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper). 套路 Target(目标抽象类) 目标抽象类定义了客户所需要的接口,可 ...

  2. Egg.js学习与实战系列 · 文件上传配置

    在使用Egg.js搭建文件上传服务时,遇到了几个一般新手都会遇到的坑. 经查阅官方文档,Egg框架中默认使用egg-multipart插件进行文件上传,所以上传文件前需要做相关的配置. 上传文件提示: ...

  3. STM32采集AD的输入阻抗问题

    在做一款消费电子产品时,需要采集电池电压(3.3V-4.2V),同时在休眠的时候希望尽量减小待机电流.电池电压采集电路采用两个1%的300K电阻进行分压,由该电路引起的待机电路为4.2/(300+30 ...

  4. 常用Java API: ArrayList(Vector) 和 LinkedList

    摘要: 本文主要介绍ArrayList(Vector)和LinkedList的常用方法, 也就是动态数组和链表. ArrayList ArrayList 类可以实现可增长的对象数组. 构造方法 Arr ...

  5. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  6. 还在用canvas画格子吗?文字烟花效果更不错噢

    大家好,我是小丞同学,一名前端爱好者 欢迎访问博主的个人网站:一口奶盖 "在人间贩卖声音 等凑够满天星辰 放烟花给你看" 上次的烟花有些许平淡,这次来放大招了,让你的名字在天空绽放 ...

  7. AXI总线简介、ID分析、DMA、Vivado烧录、系统集成

    转载:https://blog.csdn.net/CrazyUncle/article/details/89918030?depth_1-utm_source=distribute.pc_releva ...

  8. [mysql课程作业]我的大学|作业

    第八周周五 1.将xs表中王元的专业改为"智能建筑". # update xs set 专业名='智能建筑' where 姓名='王元'; # select * from xs w ...

  9. Java8新特性Stream流应用示例

    Java8新特性介绍 过滤集合 List<String> newList = list.stream().filter(item -> item != null).collect(C ...

  10. Emmet语法 —— 快速生成HTML结构

    快速生成HTML结构语法 1.生成单个标签 : 标签名+tab,比如 div 然后tab 键, 就可以生成 <div></div> 2.生成多个相同标签 div*3 + tab ...