給一棵樹\(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...