比赛链接:https://codeforces.com/contest/1294
A. Collecting Coins
先将所有数补成相等,然后看剩下的是否是3的倍数即可
1 | void solve() { |
B. Collecting Packages
简单的模拟题,按x轴排序,再按y排序
1 | struct node { |
C. Product of Three Numbers
我的想法是先质因数分解,然后讨论质因子的个数,如果质因子的种类>=3,那么一定是可以的,如果是2,那么先各取一个,然后判断剩下的是否和其中两个相等,如果只有一个质因子,那么数量至少为6。
1 | void solve() { |
D. MEX maximizing
因为一个数可以+或-任意个x,因此这些数如果%x同余,那么他们可以互相转化,这样的话只需要讨论同余的个数就可以了,我用线段树维护最小值以及最小值的下标。
1 | struct node { |
E. Obtain a Permutation
很明显如果是变换,那么一定是同一列的在变,因此对于每一列来说都是独立考虑的,我们需要计算每一列重新排列的最小花费,其实就是计算在当前有多少个数不在顺序上再加上偏移量就是花费,最后对花费和n取一个min。
1 | vector<int> a[N]; |
F. Three Paths on a Tree
首选从贪心的角度想,肯定有两个点是直径的两端,然后再选择一个点到直径上最长的距离,这里用多源的bfs就可以,记住三个点不可以相同,特判一下。
1 | vector<int> g[N]; |