2021.01.14【NOIP提高B组】模拟 总结
第一题 Candy
奇奇怪怪的题目。
一开始没有理解题目,其实就是同时变换。
打了一个暴力。
本人随机生成50000组数据,都过了,时间没超。希望出题人良心。
应该是结论题,有公式吧。
正解其实就是暴力。
设操作次数为
n
n
n。
可以证明:
n
≈
l
o
g
2
a
n\approx\ {log}_2^a
n≈ log2a(注:
a
,
b
,
c
a,b,c
a,b,c同阶)
题目大意:
给你三元组
(
a
,
b
,
c
)
\left(a,b,c\right)
(a,b,c),每一次操作变成
(
b
+
c
2
,
a
+
c
2
,
a
+
b
2
)
\left(\frac{b+c}{2},\frac{a+c}{2},\frac{a+b}{2}\right)
(2b+c,2a+c,2a+b),问多少次其中一个变为奇数。
第二题 嘟嘟噜
约瑟夫问题,感觉是结论。
或者是二分判断???
打了暴力链表加上
m
=
2
m=2
m=2的情况,打表一下找规律即可,可惜没找到
3
3
3的规律。
正解是约瑟夫问题的方法,递归转化问题。
考虑
n
,
m
n,m
n,m的情况,用
O
(
n
)
O(n)
O(n)时间复杂度做出。
设
f
n
,
m
f_{n,m}
fn,m表示有
n
n
n个人,报数到
m
m
m的最后剩下的人。
转移
f
n
,
m
=
(
f
n
−
1
,
m
+
m
)
m
o
d
n
f_{n,m}=\left(f_{n-1,m}+m\right)\ \mod\ n
fn,m=(fn−1,m+m) mod n
这样子过不去,考虑
m
m
m较小时,可以用
O
(
m
l
o
g
2
n
)
O(m log_2^n)
O(mlog2n)的算法。
分类讨论。
证明看这。
第三题 天才绅士少女助手克里斯蒂娜
维护一个区间向量的神奇操作。
以前做过类似的题目,但是忘了向量乘法的法则。
正解线段树还是树状数组,忘了。
正解是树状数组。
在模长上,向量叉积的几何意义是以两个向量为边的平行四边形的面积。
所以可得(设
a
\boldsymbol{a}
a和
b
\boldsymbol b
b分别为两个向量):
则
a
×
b
=
a
1
b
2
−
a
2
b
1
\boldsymbol a\times\boldsymbol b=a_1b_2-a_2b_1
a×b=a1b2−a2b1
然后原式变为
∑
i
=
l
r
∑
j
=
i
+
1
r
(
x
i
y
j
−
x
j
y
i
)
2
\begin{aligned}\sum_{i=l}^{r}\sum_{j=i+1}^{r}\left(x_iy_j-x_jy_i\right)^2\end{aligned}
i=l∑rj=i+1∑r(xiyj−xjyi)2
化简得:
(
∑
i
=
l
r
x
i
2
)
(
∑
i
=
l
r
y
i
2
)
−
(
∑
i
=
l
r
x
i
y
i
)
2
\begin{aligned}\left(\sum_{i=l}^{r}x_i^2\right)\left(\sum_{i=l}^{r}y_i^2\right)-\left(\sum_{i=l}^{r}{x_iy_i}\right)^2\end{aligned}
(i=l∑rxi2)(i=l∑ryi2)−(i=l∑rxiyi)2
用
B
I
T
BIT
BIT树状数组维护即可,常数不要太大。
第四题 凤凰院凶真
考虑
d
p
dp
dp,设
f
i
,
j
f_{i,j}
fi,j。然后转移很容易,然后记录前驱。但是这种方法是
O
(
n
4
)
O\left(n^4\right)
O(n4),可能可以过
n
=
400
n=400
n=400的吧(
n
,
m
n,m
n,m同阶)。
正解也是
d
p
dp
dp吗?看
n
,
m
n,m
n,m这么小。
正解是
d
p
dp
dp。
设
f
i
,
j
f_{i,j}
fi,j表示当
n
=
i
n=i
n=i且
m
=
j
m=j
m=j时的答案。
转移就是分类讨论:
当
a
i
=
b
j
,
f
i
,
j
=
m
a
x
(
f
i
−
1
,
j
,
1
+
max
0
≤
k
<
j
,
b
k
<
b
j
f
i
−
1
,
k
)
\begin{aligned}a_i=b_j,f_{i,j}=max\left(f_{i-1,j},1+\ \max_{0\le k<j,b_k<b_j}{f_{i-1,k}}\right)\end{aligned}
ai=bj,fi,j=max(fi−1,j,1+ 0≤k<j,bk<bjmaxfi−1,k)。
否则,
f
i
,
j
=
f
i
−
1
,
j
f_{i,j}=f_{i-1,j}
fi,j=fi−1,j。
用
p
r
e
i
,
j
,
0
/
1
pre_{i,j,0/1}
prei,j,0/1表示它是由什么转移过来的即可。
优化:
我们枚举j时按从小到大的顺序,然后边更新边把那一坨求出来。时间复杂度
O
(
n
m
)
O\left(nm\right)
O(nm)。