| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 【2021ACM-ICPC亚洲区域赛济南站】C、D、J、K四题超详细题解 -> 正文阅读 |
|
[C++知识库]【2021ACM-ICPC亚洲区域赛济南站】C、D、J、K四题超详细题解 |
前言我的codeforces账号:keguaiguai 基本情况济南站情况大致是: 难度分布C、D、J、K四题是竞赛中过题队伍数在100支以上的,但是在本次竞赛中一共做出4题的只有35支队伍。 K 寻找椎名真冬命题人jiangly 题目背景Mafuyu:全名Shiina Mafuyu,即椎名真冬,日本动画《学生会的一己之见》的女主角之一。 题目翻译椎名真冬藏在了世界里,立华奏正在寻找她。 思路本题求的是期望用时。这是一个非透明信息静态博弈,通过分析样例可以发现,无论立华奏采取何种策略从1号根节点开始遍历这棵树,求得的最短期望时间都相同。因此先用vector建立无向图存储树形结构,然后以一号结点为根结点开始用dfs递归遍历整棵树。注意在进栈和出栈时,根据深度递归的特性,令当前时间加1,模拟走过某个结点和离开某个结点时,时间流动的过程。每先进入一个结点,就令总时间加上当前的时间。最后让时间总和除以n-1,就得到n-1个结点的平均期望时间。 代码
感想第一次参加区域赛爆零了,当时做这题不知道为什么,考场上调了几个小时都没调出来,寒假有时间了现在自己再做一遍,发现这题非常简单,想了一会,直接写代码就AC了。不知道考试时中了什么魔咒,能紧张成那个样子。记得当时应该是思路想偏了,一开始就是按照这种思路写的代码,只是交了没过,就没有再去修改代码,而是换了其他思路写这个题,三个人越写心态越崩,就炸掉了。我记得当时dfs写得非常复杂,绝对是没有利用栈的特性,而是在那里瞎写。 J 行列式题目背景Alice:爱丽丝·玛格特洛伊德,系列作品《东方project》中的角色。 题目翻译爱丽丝想利用矩阵
A
T
A
A^{T}A
ATA的优良性质求矩阵
A
T
A
A^{T}A
ATA的行列式。将A的行列式记为det(A),满足det(
A
T
A
A^{T}A
ATA)=
d
e
t
(
A
)
2
det(A)^{2}
det(A)2。爱丽丝利用这个性质求绝对值|det(A)|。但不幸的是,当|det(A)|≠0,这个方法无法得出det(A)是正的还是负的。 思路由于|det(A)|的绝对值过于巨大,不可能直接通过高斯消元求出det(A)。只能考虑用某种手段降低数据大小,由此可以想到取模。|det(A)|的绝对值已知,但它是个大数,可以利用大数取模模板对det(A)的绝对值取模,再利用高斯消元在取模意义下求det(A)取模后的值。正数和负数取模后得到的值不同,但需满足一定条件。推导如下: 推导设有正整数x, x m o d p = = q xmodp==q xmodp==q,则q<p, x = k p + q x=kp+q x=kp+q。故 ? x m o d p = = ( ? k p ? q ) m o d p = = ( ? k p ? q + k p + p ) m o d p = = ( p ? q ) m o d p = = p ? q -x mod p ==(-kp-q) mod p==(-kp-q+kp+p)modp==(p-q)modp==p-q ?xmodp==(?kp?q)modp==(?kp?q+kp+p)modp==(p?q)modp==p?q。若 x m o d p ≠ ? x m o d p xmodp≠-xmodp xmodp?=?xmodp,需满足q≠p-q,即p≠2q。因此当p为奇数时,p不为2的倍数,满足正数和负数取模后得到的值不同。 大数取模如何对大数取模?以1234为例,将大整数分解成这种形式: 1234 = ( ( 1 ? 10 + 2 ) ? 10 + 3 ) ? 10 + 4 1234=((1*10+2)*10+3)*10+4 1234=((1?10+2)?10+3)?10+4,即从高位到低位,分别对大数的每一位上的数取模再乘10,再加上下一位上的数重复上述操作。 模意义下高斯消元如何在高斯消元时取模?首先回顾高斯消元的原理。对于一个矩阵,可以先以第一行为参考,第二至n行分别减去第一行乘一个倍数,使得第二至n行的第一个元素恰好为0。再以第二行为参考,重复上述过程,直到化为行阶梯型矩阵。如果是解多元线性方程组,此时由这个矩阵的最后一行,直接得出最后一个未知量的值。然后代入,得到倒数第二行的倒数第二个未知量的值,以此类推,直到求出所有未知量的值。如果是求这个矩阵的行列式的值,直接将对角线上的所有元素相乘即可。对于取模,在算倍数时需要用除法,则利用费马小定理求模意义下的除法值。回顾一下费马小定理: 细节注意高斯消元时,如果对角线上的值为0,则当前列无法消去,需要将含0的这一行与最后面不含0的一行交换,才能再继续消元。而且行列式中,一旦换行就会改变行列式值的正负,需要考虑在内。如果后面的行这一列全为0,那么行列式的值就为0,因为前面不为0的数都可以通过列消元消为0。由于有些元素为负值,取模时需格外注意加上模数。 代码
感想考试之前做了去年济南站的题,还专门背了高斯消元的板子,结果考试的时候完全想不到对大数取模的操作。就算是想到了,也不一定能实现代码,毕竟这类题目平时练的太少。复盘的时候,发现这道题目居然卡常数,要关同步流才能过,运行时间965ms,过于危险。还要注意模数的选取必须满足费马小定理。总之,如果没有见过类似取模的题目,本题几乎很难做出来。 D 等差数列题目背景Alice:爱丽丝·玛格特洛伊德,身份是魔法使,居住在魔法森林-玛格特罗伊德邸,拥有制作人偶的能力。 题目翻译爱丽丝收到一个含n个整数的数列作为她的生日礼物。因为她喜欢等差数列,她想把她的数列变成等差的。在一个等差数列中,一项和下一项之间的差值是一个常数。 思路首先需要知道一个模型——货舱选址问题。 货舱选址问题在一条数轴上有n家商店,坐标a1到an。现在需要在数轴上建立一家货舱,每天清晨,从货舱到每家商店都要运送一车商品。为了提高效率,求把货舱建在何处,可以使得货舱到每家商店的距离之和最小。 类比推导知道了货舱选址模型后,进行如下推导: 下凸函数证明对于每个位置,消耗的魔力满足
∣
[
a
i
?
(
i
?
1
)
(
x
+
1
)
]
?
c
1
∣
+
∣
[
a
i
?
(
i
?
1
)
(
x
?
1
)
]
?
c
1
∣
=
∣
[
a
i
?
(
i
?
1
)
x
?
c
1
]
?
(
i
?
1
)
∣
+
∣
[
a
i
?
(
i
?
1
)
x
?
c
1
]
+
(
i
?
1
)
∣
≥
∣
[
a
i
?
(
i
?
1
)
x
?
c
1
]
?
(
i
?
1
)
+
[
a
i
?
(
i
?
1
)
x
?
c
1
]
+
(
i
?
1
)
∣
=
∣
2
?
[
a
i
?
(
i
?
1
)
x
?
c
1
]
∣
=
2
?
∣
[
a
i
?
(
i
?
1
)
x
]
?
c
1
∣
|[ai-(i-1)(x+1)]-c1|+|[ai-(i-1)(x-1)]-c1|=|[ai-(i-1)x-c1]-(i-1)|+ |[ai-(i-1)x-c1]+(i-1)|≥|[ai-(i-1)x-c1]-(i-1)+ [ai-(i-1)x-c1]+(i-1)|=|2*[ai-(i-1)x-c1]|= 2*|[ai-(i-1)x]-c1|
∣[ai?(i?1)(x+1)]?c1∣+∣[ai?(i?1)(x?1)]?c1∣=∣[ai?(i?1)x?c1]?(i?1)∣+∣[ai?(i?1)x?c1]+(i?1)∣≥∣[ai?(i?1)x?c1]?(i?1)+[ai?(i?1)x?c1]+(i?1)∣=∣2?[ai?(i?1)x?c1]∣=2?∣[ai?(i?1)x]?c1∣,对两侧求和,得
Σ
∣
[
a
i
?
(
i
?
1
)
(
x
+
1
)
]
?
c
1
∣
+
Σ
∣
[
a
i
?
(
i
?
1
)
(
x
?
1
)
]
?
c
1
∣
≥
2
?
Σ
∣
[
a
i
?
(
i
?
1
)
x
]
?
c
1
∣
Σ|[ai-(i-1)(x+1)]-c1|+Σ|[ai-(i-1)(x-1)]-c1|≥2*Σ|[ai-(i-1)x]-c1|
Σ∣[ai?(i?1)(x+1)]?c1∣+Σ∣[ai?(i?1)(x?1)]?c1∣≥2?Σ∣[ai?(i?1)x]?c1∣,即
f
(
x
+
1
)
+
f
(
x
?
1
)
≥
2
?
f
(
x
)
f(x+1)+f(x-1)≥2*f(x)
f(x+1)+f(x?1)≥2?f(x),证得f(x)是下凸函数。 三分法三分法有左中点midl,右中点midr,左端点left,右端点right四个边界值,把整个查找区间分成三份。其中 m i d l = l e f t + ( r i g h t ? l e f t ) / 3 midl=left+(right-left)/3 midl=left+(right?left)/3, m i d r = r i g h t ? ( r i g h t ? l e f t ) / 3 midr=right-(right-left)/3 midr=right?(right?left)/3。对于下凸函数,如果a[midr]==a[midl]就是找到了;如果a[midl]<a[midr],令right=midr-1;如果a[midl]>a[midr],令left=midl+1。如此,端点不断向极小值点靠拢,就可以得到最终答案。 细节货舱选址时,数列t的中位数必须在O(n)的时间复杂度内计算得出,就只能用nth_element(t+1,t+(n+1)/2,t+1+n)计算。否则用sort排序会超时;另外,由于单个元素的值达到了 1 0 13 10^{13} 1013,整个数列最多有 2 × 1 0 5 2×10^{5} 2×105个元素,每次累加答案时二者相乘会爆掉long long,因此只能开__int128。__int128只能用devcpp编译,并且对于cin,cout,scanf,printf都会报错,只能自己写快读快输函数。由于对abs也会报错,abs也要自己写,但对nth_element不会报错。 代码
感想本题难在细节之处过多,可谓是综合了很多细节。首先是要知道货舱选址模型;其次是要会用绝对值不等式证明凸函数;然后是要知道三分法求极值点;还要知道nth_element函数;最后要知道__int128,并且知道报错是因为没有写快读快输函数和用了abs函数。此题算是令我大开眼界了。 C 最佳策略命题人jiangly 题目背景Ena:全名Shinonome Ena,即东云绘名,是《世界计划 彩色舞台》及其衍生作品的登场角色。 题目翻译东云绘名和水树奈奈正在玩一个游戏。 思路
代码
感想这就是一道披着博弈论外衣的动态规划题。其实观察数据量可以发现每个元素的大小都在 1 0 6 10^{6} 106以内,就可以推测出应该以元素大小为依据,从小到大进行dp递推,而不是从博弈论或贪心的角度考虑,从大到小。恰恰是博弈论和贪心蒙蔽了这道题动态规划的本质。其次就是奇数偶数问题,这非常好理解,对于当前考虑的最大值来说,偶数一定配对,奇数一定先手先选以保证最优。上述两点考虑之后,就可以根据插空法推出的组合计算公式计算了。依旧是用快速幂和费马小定理即可解决问题,同时注意C(n,0)==1就OK了。 总结关于出题人这次比赛延续了网络赛预赛的传统,每一道题目都取自二次元背景,可以说北大的诸位ACMer也是动画爱好者了。网络赛充斥着原神的题目,济南站由jiangly老师出的题目都与音游《世界计划 彩色舞台》有关,可以说老师也是音游爱好者了。但是比赛的时候没有注意到Kanade是立华奏就属于是我的一大失误了。经知乎证实,爱丽丝竟取材于《东方project》,可以说这延续了各位出题者喜欢对爱丽丝室友帕秋莉出题的传统了。 反思由于水平有限,时间精力不足,我的第一场区域赛,也就是济南站,只能补这4道铜银题,金牌题实在是心有余而力不足。实际比赛能做出这4道题可以刚好拿到金牌。希望下次昆明站能够拿到铜牌吧。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:43:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |