Processing math: 100%

2019 BUAA Summer Training 10 题解

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,问最多个数是多少。

解题思路

反向思考,求一下表示sump最小的个数。可以贪心的从上到下求解,对于每一种金币,每次选的个数必然是maxmax1max代表到当前状态选这种金币最多能选的个数),否则显然不优(更低价值的金币必然能够被更高价值金币表示)。

AC代码 - by Mogg

点击

B Count a × b

题目描述

定义f(m)为满足0im1,0jm1,i×j mod m0的二元组(i,j)个数。

g(n)=m|nf(m)

解题思路

ij mod m0的个数可转化为求m|ij的个数,即求原表格中0的个数:

f(m)=m2m1i=0m1j=0[m|ij]

显然,求和符号从0m1和从1m是等价的。于是考虑[1,m]×[1,m]的表格,对于第i行,满足m|ijj可以从mg,2mg,,gmg中取得,其中g=gcd(m,i)。也即,对于每个gcd(m,i)=gi,对二元组(i,j)的贡献均为g

枚举m的因子g,对于每个g,满足条件(gcd(m,i)=g,1im)的i的个数为ϕ(mg),其中ϕ(x)为欧拉函数,表示<x且与x互质的数的个数(证明:gcd(m,i)=g,gcd(mg,ig)=1,对于每一个与mg互质且小于mg的数x,有i=xgm)。于是式子转化为:

f(m)=m2g|mg×ϕ(mg)=m2xy=mxϕ(y)

于是g(n)=m|n(m2xy=mxϕ(y))=m|nm2xy|nxϕ(y)

对于前半部分,每个1e9以内的数的因数个数1344,因此可以直接暴力枚举因数求解;也可质因数分解后变为(1+p2i+p4i++p2kii)的形式再预处理解决。

对于后半部分,枚举x,y,变为x|nxy|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,j1][i+1,j]均为必胜状态,先手必胜当且仅当[i+1,j][i,j1]至少有一个是先手必败状态。故f[i][j]=!(f[i][j1]&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=d12r1,r3=d23r2,,r1=dn1rn

这是一个n1次方程组,我们将它化为矩阵,以4为例:

(1 1 0 00 1 1 00 0 1 11 0 0 1)(r1r2r3r4)=(d12d23d34d41)

化简这个矩阵,当n为偶数时矩阵的秩为n1,方程无解或有无穷多组解,解出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)

解题思路

先对每一个点连一个度,还剩下n2个度没有被使用,f[i][j]记录现在到了第if,用掉了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代码

点击
Powered By Valine
v1.5.2