我后期怎么就这么菜呢…
1001 AND Minimum Spanning Tree
题意
有 n ( n ≤ 2 × 1 0 5 ) n\ (n\le 2\times 10^5) n (n≤2×105)个点,第 i i i 个点的权值为 i i i ,每两个点之间都存在一条权值为两个点异或和大小的边,求一颗最小生成树。
题解
除了
1
1
1,每个数字都找到自己二进制下从小到大第一位
0
0
0,若这是第
i
i
i 位,那么这个数字和
2
i
2^i
2i 异或和为
0
0
0 ,连边即可。这样找到的数字一定比自己小,除了
2
i
−
1
2^i-1
2i−1需要特殊处理,这类数字直接连到
2
i
2^i
2i 上,如果不存在,就只好连在1上面,形成
1
1
1 的权值。
O
(
n
)
O(n)
O(n)。
1003 Divide the Stones
题意
有 n ( n ≤ 1 0 5 ) n\ (n\le 10^5) n (n≤105)个石头,第 i i i 个石头的重量为 i i i ,要求分为 k ( k ≤ n ) k\ (k\le n) k (k≤n)组,保证 k k k 是 n n n 的一个约数,那么每组正好 n / k n/k n/k个。这 k k k组石头的重量全部相同,给出一种合法方案,无解输出"no"。
题解
首先对所有石头求一个重量和,如果不能均分,那么直接无解。
特判一下
k
=
1
k=1
k=1和
k
=
n
k=n
k=n。
当
n
/
k
n/k
n/k是偶数的时候,直接蛇形地分配就行了,但如果是奇数,最后
3
3
3行的分配需要特殊处理。
此时可以证得
k
k
k 一定为奇数,若
k
k
k 为偶数,此时
n
/
k
n/k
n/k 为奇数,那么
n
n
n一定是一个偶数,那么此时
n
(
n
+
1
)
2
k
\frac {n(n+1)}{2k}
2kn(n+1)一定不是整数,这种情况我们第一步就会排除掉。
加入最后一列时,方案是合法的,把倒数第二列分两部分进行如下两两交换,再计算偏差。
原数列 | 交换后 | 偏差值 |
---|---|---|
1 | 3 | -2 |
2 | 2 | 0 |
3 | 1 | 2 |
4 | 5 | -1 |
5 | 4 | 1 |
最后一列刚刚好可以对应上这些偏差,这样就OK了。
算法复杂度
O
(
n
)
O(n)
O(n)。
1005 Good Numbers
题意
对于一个数字,如果在8进制下,每个数位上出现的数字,都在整个数字上出现了3的倍数次,且它本身是一个 P ( P < 8 ) P(P < 8) P(P<8)的倍数,那么这是一个合法的数字,求8进制下数位长度不超过 K ( K ≤ 1 0 18 ) K(K\le 10^{18}) K(K≤1018)的合法数字的个数。
题解
完全听不懂dls说的啥= =
1006 Horse
题意
有一匹马,要跨过
n
(
n
≤
1
0
4
)
n\ (n\le 10^4)
n (n≤104)棵树,每棵树具有一个高度
h
i
h_i
hi。
马的初始体力为
0
0
0,每跨过一棵树,体力下降
h
i
h_i
hi (体力可以为负数),此时将当前体力值加入答案总和。
但是马有
K
(
0
≤
K
≤
m
i
n
(
50
,
n
−
1
)
)
K (0\le K \le min (50, n - 1))
K(0≤K≤min(50,n−1)) 次吃树机会,和
M
(
0
≤
M
≤
m
i
n
(
50
,
n
)
)
M (0 \le M \le min (50, n))
M(0≤M≤min(50,n))次恢复机会。
吃树机会可在每次跨越前使用,时候后这棵树被马吃掉,高度
h
i
h_i
hi 变为
0
0
0。
恢复机会在跨越后且体力值结算后时候,将体力值恢复到之前所有吃树的高度之和。
求这匹马能获得的最大答案。
题解
吃掉一棵树,那么之后每一次结算都不会受到这次体力值下降的影响,可以认为收益为
h
i
×
(
n
−
i
+
1
)
h_i\times (n-i+1)
hi×(n−i+1)。
那么对于吃树操作,问题变成选出
K
K
K 棵树,使得
∑
h
i
×
(
n
−
i
+
1
)
\sum h_i\times (n-i+1)
∑hi×(n−i+1)最大。
恢复操作,可以清空直到上次恢复这段区间内每次跨越带来的体力值下降的影响。
问题转化成,把数列分为
M
M
M 个区间,每个区间内求一个答案,使得总的答案最小。
把上面两个问题分别解出来加和即可。
第一个问题求前K大,排个序就OK了,
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)够用了。
第二个问题就需要DP求解,
D
P
[
i
]
[
j
]
DP[i][j]
DP[i][j]表示前
i
i
i 个数字被分成
j
j
j 个区间的最小值,每次转移用斜率优化控制到
O
(
1
)
O(1)
O(1)。那么整体复杂度就是
O
(
n
M
)
O(nM)
O(nM)的了。
1007 Just an Old Puzzle
题意
给出 1 0 5 10^5 105组15数码问题,分别求它们在120步内是否有解。
题解
120步非常多了,等于说是在判断是否有解。
8数码,15数码和魔方这些模型都是类似的,它们拥有很多种状态,但是这些状态并非互通的,而是大体上被分为了几个连通块,那么就需要一个判断的好方法了。
在15数码问题中,对当前情况求逆序对个数(包括空位0),然后加上空位0到右下角的曼哈顿距离,得到的和奇偶性相同的状态互通。
复杂度
O
(
1
6
2
)
O(16^2)
O(162)。
1008 K-th Closest Distance
题意
给出长度为 n n n的一个数列,以及 m m m个询问 ( 1 ≤ n , m ≤ 1 0 5 ) (1 \le n,m\le 10^5) (1≤n,m≤105)。每次询问一个区间 [ l , r ] [l,r] [l,r] 以及 p , K p,K p,K,求这个区间内第 K K K 个在数值上接近 p p p 的数字是多少,询问强制在线。
题解
每次询问二分数字大小,主席树查找数字的数量就完了。
1010 Minimal Power of Prime
题意
给你一个数字 n ( n ≤ 1 0 18 ) n (n\le 10^{18}) n(n≤1018),对这个数字进行质因数分解后,所有质因子中,它对应 n n n最小的次幂是多少。
题解
把
n
n
n 对小于
1
0
18
5
\sqrt[5]{10^{18}}
51018的所有素数分解。如果能够分解完毕,直接返回答案,否则继续判断。
分解不出来任何质因数,则答案上限设为4,否则答案上限则是当前的那个最小次幂和4取一个最小值。
测试剩下这个数字最大能是完全多少次方的数字,用来更新答案即可,最大测试4次方。
补题
- 1001
- 1003
- 1005
- 1006
- 1007
- 1008
- 1010
看题
1002
1004
1009