時間限制: 1sec 記憶體限制: 128mb 提交: 5 解決: 0
題目描述
作為 drd 送的生日禮物,atm 最近得到了乙個俄羅斯娃娃。他對這個俄羅斯娃娃的構造很感興趣。
俄羅斯娃娃是一層一層套起來的。假設:乙個大小為 x 的俄羅斯娃娃裡面可能會放任意多個大小小於 x 的俄羅斯娃娃(而市場上的套娃一般大娃裡只能放乙個小娃)。
drd 告訴 atm ,這個俄羅斯娃娃是由 n 個小娃娃組成的,它們的大小各不相同。 我們把這些小娃娃的大小從小到大依次記為 1 到 n 。
如果 atm 想觀賞大小為 k 的小娃娃,他會先看這個小娃娃是否已經在桌子上了。 如果已經在桌子上,那麼他就可以觀賞了。否則他就開啟桌子上某乙個俄羅斯娃娃,將它套住的所有的小娃娃拿出來,擺在桌子上。
一開始桌子上只有 drd 送的大小為 n 的娃娃。注意,他只會將其中所有小娃娃拿出來,如果小娃娃裡面還套著另外的小娃娃,他是不會將這些更裡層的這些小娃娃拿出來的。
而且 atm 天生具有最優化的強迫症。他會最小化他所需要開啟的娃娃的數目。
atm 是乙個怪人。有時候他只想知道**大小為 x 的娃娃時需要開啟多少個娃娃(但並不去開啟);有時候聽 drd 說某個娃娃特別漂亮,於是他會開啟看。現在請你輸出他每次需要開啟多少個娃娃。
輸入第一行兩個數 n m ,表示娃娃的數目以及 atm 想看的娃娃的數目。
接下來 n - 1 行,每行兩個數 u v,表示大小為 u 的娃娃裡面套著乙個大小為 v 的娃娃。保證 u > v 。
接下來 m 行,每行形如:
p x :表示 atm 一定要看到大小為 x 的娃娃;
q x :表示 atm 只想知道為了看大小為 x 的娃娃,他需要開啟多少個娃娃,但實際上並不開啟他們。
輸出輸出 m 行。對應輸入中p操作或q操作需要開啟(或假想開啟)多少個俄羅斯娃娃。
樣例輸入
5 55 35 4
3 23 1
q 1q 4
p 2q 1
q 4
樣例輸出
21200
#include#include#include
#include
using
namespace
std;
const
int maxn = 1000010
;struct
nodenodes[maxn];
intn,m;
void update(int
index);
int main(void
)
for(int i=0;i1;i++)
for(int i=1;i<=n;i++)
nodes[i].depth =depth;
}/*cout << endl;
for(int i=1;i<=n;i++)
cout << endl;
*/for(int i=1;i<=m;i++)
else
father.push_back(k);
//從最上次的節點開始,進行更新,每次更新需要把自己的後繼節點全部釋放
int size =father.size();
for(k=0;k)}}
/*cout << endl;
for(int k=1;k<=n;k++)
cout << endl;
*/}return0;
} void update(int
index)
nodes[index].next.clear();
while(!que.empty())
}
}
這是錯誤的,當然可能是正確的,但是時間複雜度太高了。
藍橋杯2023年第五屆 套娃 線段樹 dfs序
題目描述 作為 drd 送的生日禮物,atm 最近得到了乙個俄羅斯娃娃。他對這個俄羅斯娃娃的構造很感興趣。俄羅斯娃娃是一層一層套起來的。假設 乙個大小為 x 的俄羅斯娃娃裡面可能會放任意多個大小小於 x 的俄羅斯娃娃 而市場上的套娃一般大娃裡只能放乙個小娃 drd 告訴 atm 這個俄羅斯娃娃是由 ...
藍橋杯 2023年第五屆真題 分糖果
問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。你的任務是 在已知的初始糖果情形下,老師一共需要補...
藍橋杯 2023年第五屆真題 分糖果
時間限制 1sec 記憶體限制 128mb 提交 5184 解決 2783 題目描述 問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲...