同步于洛谷
欢乐(?)模拟赛Day_2
人入從衆,衆從入人(人入从众,众从入人):
一個人要是開始跟隨大衆,那麼大衆的思想就會因此潛移默化這個人。
現在看到數據結構就怕= =
題目分析
T1 decomposition
題意:(抄的)给一棵以1为根的有根树,开始只有1有标记。每次操作可以给某个点打上标记,或者询问从某个点开始向上跳,遇到的第一个有标记的点。
思路:揣測了出題人的良心,覺得可能是樹鏈剖分,然後放棄了想了一下打了暴力,因爲某個點的答案就是最近有標記的點,所以暴力處理修改,可以做到
O
(
1
)
O(1)
O(1)查詢。
正解:需要將均衡一下查詢和修改的複雜度——變成
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。(抄的)分析性质, 如果一个点 x 从始至终都没有被标记, 就可以把 x 合并到 x 的父亲上去。而並查集從來都是往上走,那——逆過來做,由于当前询问的答案只和前面的修改有关,沒有打過標記的點的案可以直接併入父親。那麼增標記就變成了刪標記和合併。
模型:Pay phone packing sequence
T2 tenki(AC)
題意:第1个人选择第1个座位坐下。之后的每个人进入时, 他会选择一个离最近的已经坐下的人尽可能远的空位。如果有多个空位使得离最近的人同样远, 则从中随机选取一个。若有两个人选择的位置相邻, 他们就会不满意。为了让所有人都满意, 至少需要几个座位?
正解:發現前兩個人一定佔據最左和最右。第三個人會佔據最中間,第四個人會佔據第一/二個人和第三個人的最中間……那麼除了前兩個人是特殊情況,可以推出一個式子——n個座位可以坐的人數
f
(
n
)
f(n)
f(n)的遞推式:
if(n<=0) return 0;
if(n<=3) return 1;
if(n&1) return 2*f((n>>1)-1)+1;
return f((n>>1)-2)+f((n>>1)-1)+1;
二分答案,我們可以得到n個人需要的座位數。顯然,這不夠快。
利用這個遞推式打表——然後發現了規律:每第
2
n
+
2
2^n+2
2n+2項出現斷層(積累兩位空隙到飽和狀態),很容易(高中必修五)得到通式:
f
(
x
)
=
x
+
2
1
+
⌊
l
o
g
2
(
x
−
2
)
⌋
f(x)=x+2^{1+\lfloor{log_2(x-2)}\rfloor}
f(x)=x+21+⌊log2(x−2)⌋(但是我的通式比這個麻煩多了艹)
高精度。
T3 mafumafu
看 都 沒 看 但是mafumafu是小天使
高精度掛了很多次,沒時間了。
題意:(抄的)给定一个正整数 k , 以及一棵n个节点的以1为根的有根树, 边有长度.
记
L
C
A
(
a
,
b
)
LCA(a,b)
LCA(a,b)表示
a
a
a与
b
b
b在树上的最近公共祖先,
d
i
s
t
(
x
)
dist(x)
dist(x)表示树根到
x
x
x的距离.
每个节点可以是黑色或白色, 初始时每个节点的颜色为白色.进行
m
m
m次操作, 每次操作是以下两种形式之一:
修改操作: 给出一个修改节点
x
x
x,将节点
x
x
x染上黑色.
询问操作: 给出一个询问节点
x
x
x, 记所有黑点形成的集合为
S
S
S, 求出下面式子的值:
∑
y
∈
S
F
(
d
i
s
t
(
L
C
A
(
x
,
y
)
)
)
\sum\limits_{y\in S}^{} F(dist(LCA(x, y)))
y∈S∑F(dist(LCA(x,y)))
其中F函數爲
F
(
x
)
=
∑
i
=
1
n
i
k
F(x)=\sum\limits_{i=1}^ni^k
F(x)=i=1∑nik
答案對998244353取模。
正解:先從k=0入手,那麼只要求
∑
y
∈
S
d
i
s
t
(
L
C
A
(
x
,
y
)
)
\sum\limits_{y\in S}^{} dist(LCA(x, y))
y∈S∑dist(LCA(x,y))
由于LCA到根的距离就是x,y到根的路径交集的长度,所以每加入一个点y时,利用差分的思想,就将y到根的路径上所有边的覆盖次数+1,询问时答案就是x到根的路径上每条边的长度
×
\times
×它的覆盖次数。(k=0時,長度增加1,權值亦只增加1,因此權值即長度)
k$\not=
0
的
情
況
就
很
顯
然
了
,
長
度
從
i
−
1
增
加
到
i
,
權
值
增
加
0的情況就很顯然了,長度從i-1增加到i,權值增加
0的情況就很顯然了,長度從i−1增加到i,權值增加i^k
,
那
麼
也
可
以
差
分
,
那
麼
邊
,那麼也可以差分,那麼邊
,那麼也可以差分,那麼邊(u,v)
權
值
也
是
固
定
的
,
爲
權值也是固定的,爲
權值也是固定的,爲F(dist(v))-F(dist(u))
。
維
護
一
個
樹
上
邊
有
權
值
的
區
間
的
查
詢
和
修
改
,
用
樹
鏈
剖
分
。
關
於
。維護一個樹上邊有權值的區間的查詢和修改,用樹鏈剖分。 關於
。維護一個樹上邊有權值的區間的查詢和修改,用樹鏈剖分。關於F(x)
的
預
處
理
,
若
的預處理,若
的預處理,若f(n)=nk,n=xy$,則,$f(n)=nk=(xy)k=xky^k=f(x)f(y)$,即積性函數,可以用線性篩處理合數。
考試總結
自閉了,其實比較有性質的題目但是沒有去鑽。大衆分也沒有把握拿到。運氣成分偏大。
屬於那種見過的可能會做,沒見過的一定不會做。
但是不得不說,寫代碼前捋一捋思路還是有好處的雖然還是寫到一半懵了