平日裡最喜歡做的事就是蒸發學水。
【題目描述】
小 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 編上了號碼 參見後面的樣例 即...