Logo Fee_cle6418的博客

博客

InfOJ Beginner Round 3 题解

2023-04-03 21:54:16 By Fee_cle6418

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$ 两个位置就填 --

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。