開始時有一張\(n\)個點沒有邊的圖,\(q\)次操作加入一條邊,如果加入後圖是乙個沙漠(只有邊仙人掌的圖)時才能夠加入。
每次加入後詢問:開始所有點都是白色,\(k\)次隨機挑乙個點染黑,求最後白色點的連通塊數和黑色點的連通塊數的和。
\(1\leq n\leq 10^5,1\leq q\leq 3\times 10^5,1\leq k\leq 10^9\)
然後考慮怎麼求答案。
仙人掌的連通塊數=點數-邊數+環數。
至於本題我們可以考慮這些東西存在的期望數量。
設\(w_i\)表示指定\(i\)個點是白點的概率,那麼顯然就是\((\frac)^k\)。
然後設\(b_i\)表示指定\(i\)個點是黑點的概率,我們考慮容斥指定一些點是白點就是
\[b_i=\sum_^i\binom(-1)^j\left(\frac\right)^k
\]這樣是\(o(i)\)的,但是其實我們只有求環的出現概率時這個值會很大,但是環的大小和不超過\(n\),所以可以在需要的時候暴力求。
時間複雜度:\(o(q\log n)\)
#include#include#include#include#define ll long long
using namespace std;
const ll n=2e5+10,p=998244353;
struct lct
bool direct(ll x)
void pushup(ll x)
void rev(ll x)
void rvy(ll x)
void pushdown(ll x)
pushup(x);return;
} void rotate(ll x)
void splay(ll x)
return;
} void access(ll x)
void makeroot(ll x)
void link(ll x,ll y)
void split(ll x,ll y)
}t;ll n,q,k,op,ans,fa[n],inv[n],fac[n],fnv[n];
ll find(ll x)
ll power(ll x,ll b)
return ans;
}ll c(ll n,ll m)
ll w(ll x)
ll b(ll x)
return (ans+p)%p;
}signed main()
else if(x!=y)
} ans=(ans+p)%p;
printf("%lld\n",las=ans);
} return 0;
}
Foreign 染色 LCT 線段樹
詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。我們將邊兩端的點顏色相同的邊設為實邊,不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在l...
YbtOJ 732 斐波那契 特徵方程,LCT
給出 n 個點的一棵樹,以 1 為根,每個點有點權 a i 要求支援 m 次操作 修改乙個修改乙個節點的父節點 修改一條路徑的權值為 w 給出 u 詢問 fbi a u 給出 u,v 將路徑 u v 的點權排列好後設為 b 求 sum k sum kfbi sum jb z 其中 fbi i 表示第...
3 28 省選模擬賽 染色 LCT 線段樹
發現和sdoi2017樹點塗色差不多 但是當時這道題模擬賽的時候不會寫 賽後也沒及時訂正 所以這場模擬賽的這道題雖然秒想到了lct和線段樹但是最終還是只是打了暴力。痛定思痛 還是要把這道題給補了。但是對於這道題來說 暴力還是有價值的。考慮20分 每次暴力dfs.考慮對於樹是隨機生成的 那麼期望高度為...