Solved | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
9/13 | O | O | Ø | . | O | O | O | O | . | O | . | O | . |
- O for passing during the contest
- Ø for passing after the contest
- ! for attempted but failed
- · for having not attempted yet
题目来源:2015 ACM-ICPC Asia Changchun Regional Contest
A Too Rich
题目描述
给定一些价值为1,5,10,20,50,100,200,500,1000,2000的金币,要用最多的个数表示给定的p,问最多个数是多少。
解题思路
反向思考,求一下表示sum−p最小的个数。可以贪心的从上到下求解,对于每一种金币,每次选的个数必然是max或max−1(max代表到当前状态选这种金币最多能选的个数),否则显然不优(更低价值的金币必然能够被更高价值金币表示)。
AC代码 - by Mogg
B Count a × b
题目描述
定义f(m)为满足0≤i≤m−1,0≤j≤m−1,i×j mod m≠0的二元组(i,j)个数。
求g(n)=∑m|nf(m)。
解题思路
求ij mod m≠0的个数可转化为求m|ij的个数,即求原表格中0的个数:
f(m)=m2−∑m−1i=0∑m−1j=0[m|ij]
显然,求和符号从0到m−1和从1到m是等价的。于是考虑[1,m]×[1,m]的表格,对于第i行,满足m|ij的j可以从mg,2mg,…,gmg中取得,其中g=gcd(m,i)。也即,对于每个gcd(m,i)=g的i,对二元组(i,j)的贡献均为g。
枚举m的因子g,对于每个g,满足条件(gcd(m,i)=g,1≤i≤m)的i的个数为ϕ(mg),其中ϕ(x)为欧拉函数,表示<x且与x互质的数的个数(证明:gcd(m,i)=g,gcd(mg,ig)=1,对于每一个与mg互质且小于mg的数x,有i=xg≤m)。于是式子转化为:
f(m)=m2−∑g|mg×ϕ(mg)=m2−∑xy=mxϕ(y)
于是g(n)=∑m|n(m2−∑xy=mxϕ(y))=∑m|nm2−∑xy|nxϕ(y)
对于前半部分,每个1e9以内的数的因数个数≤1344,因此可以直接暴力枚举因数求解;也可质因数分解后变为∏(1+p2i+p4i+…+p2kii)的形式再预处理解决。
对于后半部分,枚举x,y,变为∑x|nx∑y|nxϕ(y)。而欧拉函数和e=[n=1]的狄利克雷卷积为id,故∑d|nϕ(d)=n,即原式=∑x|nxnx=∑x|nn。暴力枚举因数即可。
AC代码
C Play a game
题目描述
给一个字符串s和一个字符串集合T,在s上给定的多组区间上玩游戏,每个人可以取走一个开头的元素或结尾的元素,到达空串或T中任意一个串的时候,游戏立即结束,下一手要操作的玩家失败,另一方获胜。问都采取最优策略的情况下谁能胜利。
解题思路
f[i][j] 表示当前[i,j]区间先手必败还是必胜,先手必败当且仅当[i,j]是终止状态或[i,j−1][i+1,j]均为必胜状态,先手必胜当且仅当[i+1,j][i,j−1]至少有一个是先手必败状态。故f[i][j]=!(f[i][j−1]&f[i+1][j])。
问题转化成了区间dp,用AC自动机跑出终止状态对应的位置,再进行区间dp即可。
但是这样的复杂度太高,会获得TLE。
考虑使用bitset对区间dp进行优化。改变f[i][j]的含义,变为当前区间长度为i,起始位置为j的必胜必败状态。于是有
f[i][j]=~(f[i-1][j]&f[i-1][j+1])
, 即f[i]=~(f[i-1]&(f[i-1]>>1))
。复杂度O(n264),可以勉强卡过。AC代码
D Pipes selection
题目描述
解题思路
AC代码
E Rebuild
题目描述
给定n个点组成的多边形,要求以每个点为圆心画圆,相邻两个点之间的圆相切,求最大圆面积之和。
解题思路
任意找一个点作为起始点,设这个点对应半径r1,那么有r2=d12−r1,r3=d23−r2,…,r1=dn1−rn
这是一个n元1次方程组,我们将它化为矩阵,以4为例:
(1 1 0 00 1 1 00 0 1 11 0 0 1)(r1r2r3r4)=(d12d23d34d41)
化简这个矩阵,当n为偶数时矩阵的秩为n−1,方程无解或有无穷多组解,解出r1范围后问题转化成一个一元二次方程;n为奇数时秩为n,方程有唯一解。
AC代码 - by qxforever
F Almost Sorted Array
题目描述
问一个数列能否删掉某个数使得最终序列有序。
解题思路
升序降序讨论一番贪心删除就可以了。
AC代码 - by qxforever
G Dancing Stars on Me
题目描述
整数格上给n个点,问是不是正多边形。
解题思路
直接判断正方形即可。
AC代码
H Partial Tree
题目描述
给一个函数f,让你建一棵树,它的度序列为di,最大化∑ni=1f(di)。
解题思路
先对每一个点连一个度,还剩下n−2个度没有被使用,f[i][j]记录现在到了第i个f,用掉了j个度的f 的总和最大值。这是一个完全背包问题。
AC代码
I Chess Puzzle
题目描述
解题思路
AC代码
J Chip Factory
题目描述
给定一个数列,求max(ai+aj)⊕(ak)。
解题思路
暴力即可。复杂度O(12n3)。
也可以将所有元素加入一棵trie,再枚举i,j进行判断,复杂度O(n2logmax),常数挺大。
AC代码
K Maximum Spanning Forest
题目描述
解题思路
AC代码
L House Building
题目描述
有一堆立方体积木,给定一个积木高度,求露在外面的表面积。
解题思路
暴力枚举每一层即可。
AC代码 - by Mogg
M Security Corporation
题目描述
解题思路
AC代码
v1.5.2