A.Infinity Gauntlet
水题。
代码:
1 |
|
B.High School: Become Human
给定整数$x、y$,求$x^y$和$y^x$的大小关系,首先肯定用log
函数取一下对数,然后再设稍微小一点的eps
比较一下即可。这里注意用long double
提高一下精度,double
会出现一些奇奇怪怪的问题。
代码:
1 |
|
C.Three displays
题意就是给定长度为$n$的数列$S$和$C$,求三个数满足$i \lt j \lt k,S_i \lt S_j \lt S_k$的情况下$C_i + C_j + C_k$的最小值,对于这种三元之间的关系问题可以考虑枚举中间那个数来优化复杂度至$O(n ^ 2)$。
代码:
1 |
|
D.Fair
题意就是给定$n$个城市和$m$条边权为$1$的无向边,有$k$种商品,每个城市一开始已有一种商品$a_i$,求至少个其他城市的人带自己城市的商品到第$i$个城市,使得城市$i$收集到至少$s$种商品的最小花费。
由于商品的种类数最多$100$个,因此可以考虑已商品为点,枚举商品时把具有当前商品的城市的花费设为$0$,其他为$ +\infty$,做$k$次多源BFS
,即用$dis[i][j]$表示运送第$j$种商品到第$i$个城市的最小花费。然后每个$dis[i]$取前$s$小个花费相加即可。
这里有个小优化技巧,求数组的前k大可以用nth_element(begin, begin + k, end)
这个函数,而不用每次都sort
代码:
1 |
|
E.Petr and Permutations
题意就是存在一个长度为$n$的初始排列,Petr
会对一个排列做$3n$次两两元素随机交换,而Um_nik
会做$7n + 1$次,现给定排列后的结果,求是Petr
做的还是Um_nik
做的。
由于题目是结果唯一的,那就是符合所有特殊情况,考虑一种特殊情况——他们两个人运气够好,使得相邻的两次交换总是互相抵消,而交换元素位置会使得逆序数的奇偶发生改变(一开始的初始序列逆序数为$0$),逆序数嘛BIT
搞搞,注意开long long
就好。
那么只要看交换次数是奇数还是偶数就行了。因此分类讨论一下
- 当$n$为奇数时,$3n$为奇数,$7n + 1$为偶数,如果逆序数是奇数则肯定是
Petr
,否则为Um_nik
- 当$n$为偶数时,$3n$为偶数,$7n + 1$为奇数,如果逆序数是奇数则肯定是
Um_nik
,否则为Petr
代码:
1 |
|
F.AND Graph
题意就是给你$n、m$,表示有$m$个数大小在$[0, 2 ^ n - 1]$之间,如果有两个数$a \& b = 0$,那么这两个数之间有一条无向边,求这$m$个数最终分成几个连通块。
自己YY
了很久没调出来滚去看题解了。
- 显然一个数本身可以和其补码相连;
- 补码的任意为$0$的位置可以改为$1$,因为这样再做一次补码后该位会变回$0$,不会改变按位与为$0$的结果;
- 补码可以随时和补码的补码相连。
这样DFS
一下就可以了。
代码:
1 |
|