A
暴力枚举每个数的倍数统计答案。即,对每个数 $x$,对每个 $x|y$,$cnt_y$ ++
,最后输出 $cnt=i$ 的数的个数。
期望时间复杂度 $O(n\log V)$。
根据 $P(x\ge kE(x))\le \dfrac{1}{k}$ 可以推出在本题数据组数(六组极限数据)下,存在一组数据使得上面算法对 $cnt$ 执行操作次数超过 $10^7$ 的概率 小于 $0.01$。
而又因为只生成了一次数据,所以正确率是比较大的。实事求是地讲,这样做在数据下确实也不会超时。
B
把需要得到的排列拆成环。
对于一元环,不进行任何操作。对于 $k$ 元环,可以用 $k+1$ 次操作归位。
2 3 1 0 2 3 0 1 2 0 3 1 0 2 3 1 1 2 3 1
由于 $k$ 元环数不超过 $0.5n$,所以总操作次数小于等于 $0.5n+n$。
C
对每个前缀做单调栈,最小值、最大值的单调栈均维护出来。
容易发现,两个单调栈内元素总个数 $\le 4000$,可以 $O(nV)$ 枚举每个元素,计算这段位置上最小值、最大值分别是多少。
得到以上信息后做一个二维前缀和即可。
时间复杂度 $O(nV+V^2+q)$。$nV$ 部分常数特别小,时限也给得很大,应该能无压力过。
(其实用不着单调栈也可以做到同样复杂度!)
D
考虑枚举乘积部分的 $a_i,j,a_k$,求出有几种 $(i,k)$ 能满足要求。实际上 $i,k$ 满足条件的都是一段区间,所以这就是求,有多少个 $x\in [l_1,r_1],y\in [l_2,r_2]$ 使得 $x+y=z$。这是容易 $O(1)$ 计算的。
设 $m=n+\max a_i$,时间复杂度 $O(m\log^2 m)$。
E
考虑用三进制凑 $X$。
所有正整数可以唯一表示成 $\sum 3^ia_i$ 的形式,$a_i\in\{-1,0,1\}$。
每个 $3^x$ 放两个在 $a$ 里,一共用了 $2\times \log_310^9=38$ 个元素。
如果 $X/2$ 的表示中 $a_i=1$,$2i-1,2i$ 两个位置就填 ++
;如果 $X/2$ 的表示中 $a_i=0$,$2i-1,2i$ 两个位置就填 +-
;如果 $X/2$ 的表示中 $a_i=-1$,$2i-1,2i$ 两个位置就填 --
。