2018 CCPC 网络选拔赛(部分题解)
Buy and Resell
解题思路
这道题和 Codeforces 867E基本相同:Codeforces867E题解
但是这道题要求输出最少买卖操作数,其实就是让我们尽可能地多反悔,由分析,第一次弹出是反悔,第二次弹出是真的买卖,于是优先队列里加一个元素个数的信息,把元素个数大的放在前面(这样下一次弹出时就是反悔操作了)。
Code
1 |
|
Dream ( hdu6440 )
解题思路
定义 $a+b$ 为 $(a+b) \mod p$
定义 $a\cdot b$ 为 $a\cdot b \mod p$
Code
1 |
|
Find Integer ( hdu6441 )
解题思路
- $n>2$:由费马大定理,$n>2$ 时方程无整数解。
- $n=0$:$1+1=1$,不可能
- $n=1$:略
- $n=2$:$a^2=c^2-b^2=(c-b)(c+b)$
当 $a$ 为奇数时,令 $c-b=1,c+b=a^2$;当 $a$ 为偶数时,令 $c-b=2,c+b=a^2/2$
Code
1 |
|
Tree and Permutation ( hdu6446 )
解题思路
单独计算每一条边的贡献:
- 设这条边一侧有 $a$ 个节点,另一侧有 $b$ 个节点,那么从两侧各选出一个节点连起来时就会经过该边一次,共有 $C_a^1\times C_b^1\times A_2^2 = 2\cdot a\cdot b$ 种选法。(注意顺序不同也要算进去)
- 将选出来的两个点绑在一起与其他所有点做全排列求得这两个点一起出现的次数,共 $A_{n-1}^{n-1} = (n-1)!$ 次。
故该条边对答案的贡献为 $len\cdot 2\cdot a\cdot b\cdot (n-1)!$
最后把所有边的贡献加起来即可。
Code
1 |
|
YJJ’s Salesman ( hdu6447 )
解题思路
对于两个点 $A$ 和 $B$,只要 $B$ 在 $A$ 的严格右上方,那么从 $A$ 走到 $B$ 就可以得到 $v_B$ 的收益。所以先以 $x$ 为第一关键字从小到大、$y$ 为第二关键字从大到小排序(这样可以保证dp时转移合法),然后可以dp。
设 $dp[i]$ 表示到走到第 $i$ 个点的最大收益,那么转移方程为:
$$dp[i] = \max\limits_{j<i 且 y[j]<y[i]}{dp[j]} + v[i]$$
所以可以用一个线段树来存dp值,线段树下标为纵坐标(这是一颗纵坐标的值域线段树),要先对纵坐标离散化一下。
然后dp转移即变成了区间查询最大值和单点修改。
时间复杂度:$O(n\log n)$
Code
1 |
|