常州模擬賽d2t3 小X的佛光

2022-05-01 10:18:08 字數 1901 閱讀 8747

平日裡最喜歡做的事就是蒸發學水。

【題目描述】

小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是一

個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n – 1

條邊,使得城市的各個地點能夠相互到達。

小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a 地走到 b 地,並在沿

途各個地點留下乙個水塘。此後,小 x 會從 c 地走到 b 地,並用佛光蒸發沿途

的水塘。由於 x 城是乙個學佛橫行的城市,學水留下的水塘即使沒有被小 x 蒸

發,也會在第二天之前被其他學佛蒸發殆盡。

現在,小 x 想要知道,他每一天能夠蒸發多少水塘呢?

【輸入格式】

從檔案 light.in 中讀取資料。

第一行三個整數 n、q、num,分別表示 x 城地點的個數,小 x 蒸發學水的

天數,以及測試點編號。注意,測試點編號是為了讓選手們更方便的獲得部分分,

你可能不需要用到這則資訊,在下發的樣例中,測試點編號的含義是該樣例滿足

某一測試點限制。

n – 1 行,每行兩個整數 x、y,表示 x 地與 y 地之間有一條邊。

接下來 q 行,每行三個整數 a、b、c,表示一天中,有一名學水從 a 地走到

b 地,而小 x 會從 c 地走到 b 地。

【輸出格式】

輸出 q 行,每行乙個整數,表示小 x 能夠蒸發的水塘數。

【樣例 1 輸入】

3 3 1

1 22 3

1 2 3

1 1 3

3 1 3

【樣例 1 輸出】

分析:這道題的本質就是要求樹上同乙個點為起點到兩個端點的路徑交,暴力的複雜度是o(nq)的,可以過50%的點,因為涉及到路徑,如果用樹鏈剖分可以過16個點,不過不能用memset,要用時間戳。正解非常巧妙,其實對於樹上的任意三點只有可能是兩種情況:一條鏈或者以某個點為中心.

顯然對於第二種情況,我們只需要求出中心到b點的距離就好了,如果是一條鏈我們該怎麼做呢?這個時候我們可以把中心定義為深度為中位數的那個點,結合兩個中心的定義,我們可以腦補出怎麼求中心:abc三個點兩兩求lca,其中深度最大的lca就是中心,最後求一下中心到b點的距離就好了。

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 200010

;int n, q, num,head[maxn],to[maxn * 2],nextt[maxn * 2],tot = 1,dist[maxn],fa[maxn][20

];void add(int x, int

y)void dfs(int u, int

from, int

d) }

}int lca(int x, int

y)

return fa[x][0];}

intmain()

dfs(

1, 0, 1

);

for (int j = 1; j <= 19; j++)

for (int i = 1; i <= n;i++)

fa[i][j] = fa[fa[i][j - 1]][j - 1

];

while (q--)

return0;

}

常州模擬賽d8t2 繪畫

分析 考慮記錄每個座標上每個顏色出現了幾次,並由此算出每個顏色 在這個座標上的貢獻。答案肯定是原圖的答案扣去矩形的答案,再加 上那個矩形同種顏色的貢獻,這裡的答案指的是 dis.我們先要記錄每個顏色在各個位置出現的次數,因為每一次都是區間操作嘛,所以我們用二維差分可以很好地維護,字首和求出出現的次數...

常州模擬賽d7t2 陣列

hjz 的陣列初始時有 n 個元素。他可以把乙個位置上的數加上或減去乙個固定的 數 x。一天 ljz 和 hzy 來 hjz 家玩。ljz 突發奇想,提出了乙個問題 如何在給定的 操作步數內最小化陣列所有元素的乘積呢?hjz 百思不得其解,但是他想博得 hzy 的好感,就把這個問題交給你啦 由於最小...

NOIP2017提高組正式賽 D2T3列隊

sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia所在的方陣中有n m名學生,方陣的行數為 n,列數為 m。為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中從 1 到 n m 編上了號碼 參見後面的樣例 即...