湖南集訓 談笑風生 線段樹合併

2022-05-20 22:55:49 字數 914 閱讀 5017

給一棵樹\(n\)個節點,\(q\)次詢問,每次給定\(p,k\),問有多少三元組\((p,b,c)\)滿足\(p,b\)均為\(c\)的父親,\(p,b\)在樹上的距離不超過\(k\)

\(n,q\le 10^5\)

很有意思的一道題。

兩種情況討論:

最後答案即為兩種情況之和

注意空間限制,需要動態開點。

#include #include #define maxn 300003

#define maxm 300003*30

#define ll long long

using namespace std;

int head[maxn],nxt[maxn*2],vv[maxn*2],tot;

inline void add_edge(int u, int v)

int cnt;

ll tre[maxm*2];

int sl[maxm*2],sr[maxm*2];

void change(int &x, int l, int r, int pos, int val)

ll query(int x, int l, int r, int ql, int qr)

int n,q;

int sz[maxn],rot[maxn],dep[maxn];

void dfs(int u, int fa)

change(rot[u], 1, n, dep[u], sz[u]-1);

rot[fa]=merge(rot[fa], rot[u], 1, n);

}int main()

dfs(1, 0);

while(q--)

return 0;

}

湖南集訓 談笑風生

嘟嘟嘟 這題剛開始猶豫了一會兒,以為 高明 的優先順序大於 談笑風生 不過樣例表明只要兩點間距離不超過 x 兩人就算 談笑風生 接下來看看怎麼回答詢問。首先 a 是固定的,且 a,b 都是 c 的祖先。那就得分類討論 1.b 是 a 的祖先,那麼 c 就是 a 的子樹中的所有點,根據乘法原理,三元組...

洛谷P3899 湖南集訓 談笑風生(線段樹合併)

為了學長鏈剖分開的題,結果還是忍不住寫了個線段樹合併 首先不難發現 b 要麼是 a 的祖先,要麼是 a 的後代。b 是 a 的祖先很好弄,因為 c 的數量始終等於 size a 1 對於 b 要麼是 a 的後代的情況,那麼就是求 a 的子樹中和它深度差不超過 k 的點的 size 1 之和,按照深度...

luogu 3899 湖南集訓 談笑風生

題意 這題意太草了就不描述了,有黑眼鏡框和 暗示真惡毒啊 sol 對於固定的a來說,每個b的貢獻是min siza siz b 1 min siz a,siz b 1 min si za sizb 1 考慮a是b的祖先和b是a的祖先兩種情況 把min去掉 1.對於b是a的祖先,明顯答案是min de...