正题


题目大意

开始时有一张nnn个点没有边的图,qqq次操作加入一条边,如果加入后图是一个沙漠(只有边仙人掌的图)时才能够加入。

每次加入后询问:开始所有点都是白色,kkk次随机挑一个点染黑,求最后白色点的连通块数和黑色点的连通块数的和。

强制在线

1≤n≤105,1≤q≤3×105,1≤k≤1091\leq n\leq 10^5,1\leq q\leq 3\times 10^5,1\leq k\leq 10^91≤n≤105,1≤q≤3×105,1≤k≤109


解题思路

因为强制在线肯定需要用LCTLCTLCT维护,至于仙人掌我们维护在环上的边就好了。

然后考虑怎么求答案。

仙人掌的连通块数=点数-边数+环数。

至于本题我们可以考虑这些东西存在的期望数量。

设wiw_iwi​表示指定iii个点是白点的概率,那么显然就是(n−in)k(\frac{n-i}{n})^k(nn−i​)k。

然后设bib_ibi​表示指定iii个点是黑点的概率,我们考虑容斥指定一些点是白点就是
bi=∑j=0i(ij)(−1)j(n−jn)kb_i=\sum_{j=0}^i\binom{i}{j}(-1)^j\left(\frac{n-j}{n}\right)^kbi​=j=0∑i​(ji​)(−1)j(nn−j​)k

这样是O(i)O(i)O(i)的,但是其实我们只有求环的出现概率时这个值会很大,但是环的大小和不超过nnn,所以可以在需要的时候暴力求。

时间复杂度:O(qlog⁡n)O(q\log n)O(qlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=2e5+10,P=998244353;
struct LCT{ll fa[N],t[N][2],siz[N];bool w[N],v[N],lazy[N],r[N],p[N],hp[N];stack<ll> s;bool Nroot(ll x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}bool Direct(ll x){return t[fa[x]][1]==x;}void PushUp(ll x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+(!p[x]);w[x]=(p[x]&v[x])|w[t[x][0]]|w[t[x][1]];hp[x]=p[x]|hp[t[x][0]]|hp[t[x][1]]; return;}void Rev(ll x){r[x]^=1;swap(t[x][0],t[x][1]);return;}void Rvy(ll x){w[x]=hp[x];lazy[x]=v[x]=1;return;}void PushDown(ll x){if(r[x])Rev(t[x][0]),Rev(t[x][1]),r[x]=0;if(lazy[x]){if(t[x][0])Rvy(t[x][0]);if(t[x][1])Rvy(t[x][1]);lazy[x]=0;}PushUp(x);return;}void Rotate(ll x){ll y=fa[x],z=fa[y];ll xs=Direct(x),ys=Direct(y);ll w=t[x][xs^1];if(Nroot(y))t[z][ys]=x;t[y][xs]=w;t[x][xs^1]=y;if(w)fa[w]=y;fa[x]=z;fa[y]=x;PushUp(y);PushUp(x);return; }void Splay(ll x){ll y=x;s.push(x);while(Nroot(y))y=fa[y],s.push(y);while(!s.empty())PushDown(s.top()),s.pop();while(Nroot(x)){y=fa[x];if(!Nroot(y))Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}void Access(ll x){for(ll y=0;x;y=x,x=fa[x])Splay(x),t[x][1]=y,PushUp(x);return;}void MakeRoot(ll x){Access(x);Splay(x);Rev(x);return;}void Link(ll x,ll y){MakeRoot(x);fa[x]=y;Access(x);return;}void Split(ll x,ll y){MakeRoot(x);Access(y);Splay(y);return;}
}T;
ll n,q,k,op,ans,fa[N],inv[N],fac[N],fnv[N];
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll C(ll n,ll m)
{return fac[n]*fnv[m]%P*fnv[n-m]%P;}
ll W(ll x)
{return power((n-x)*inv[n]%P,k);}
ll B(ll x){ll ans=0;for(ll i=0;i<=x;i++){ll w=power((n-i)*inv[n]%P,k);w=w*C(x,i)%P;(ans+=w*((i&1)?-1:1))%=P;}return (ans+P)%P;
}
signed main()
{freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);inv[1]=fnv[0]=fac[0]=1;for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;for(ll i=1;i<N;i++)fnv[i]=fnv[i-1]*inv[i]%P,fac[i]=fac[i-1]*i%P;scanf("%lld%lld%lld%lld",&n,&q,&k,&op);for(ll i=1;i<=n;i++)fa[i]=i,T.siz[i]=1;ll w2=W(2),b2=B(2),las=0;ans=(W(1)*n+op*B(1)*n)%P;int cnt=n;while(q--){ll x,y;scanf("%lld%lld",&x,&y);x^=las;y^=las;if(find(x)!=find(y)){fa[find(x)]=find(y);++cnt;T.p[cnt]=T.hp[cnt]=1;T.Link(x,cnt);T.Link(y,cnt);(ans-=w2+op*b2)%=P;}else if(x!=y){T.Split(x,y);if(!T.w[y]){T.w[y]=T.v[y]=T.lazy[y]=1;ll S=T.siz[y];(ans+=W(S)-w2)%=P;if(op)(ans+=B(S)-b2)%=P;}}ans=(ans+P)%P;printf("%lld\n",las=ans);}return 0;
}

YbtOJ-毒瘤染色【LCT】相关推荐

  1. 【YBT2022寒假Day3 C】毒瘤染色(LCT)(圆方树)(容斥)

    毒瘤染色 题目链接:YBT2022寒假Day3 C 题目大意 要你在线实现一个操作: 一开始有 n 个点,没有边,然后操作会给你一条边. 如果保证加了之后这个图还是沙漠就加上. 然后每次加完边之后问你 ...

  2. 洛谷 P2486 [SDOI2011]染色 LCT

    Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #inc ...

  3. java分页代码思路,记录--java 分页 思路 (hibernate关键代码)

    有时会脑袋蒙圈,记录下分页的思路 下面代码是hibernate的分页,其分页就是从第几条数据为起点,取几条数据.比如在mysql中的limit(5,10)取的就是第6条到第10条 在下面代码中的pag ...

  4. YBTOJ洛谷P2387: 魔法森林(LCT)

    解析 LCT从板子到算法的入门题吧 有一些不知道的很实用的技巧 把边按a排序从小到大加入边 那么我们只需要维护当前1-n路径上的b的最小值即可 如果这条边两端点本来不连通,就直接link 否则找到路径 ...

  5. YbtOJ#732-斐波那契【特征方程,LCT】

    正题 题目链接:http://www.ybtoj.com.cn/contest/125/problem/2 题目大意 给出nnn个点的一棵树,以111为根,每个点有点权aia_iai​.要求支持mmm ...

  6. [SDOI2011]染色

    题目:染色 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 分析: (1)很裸的树链剖分,然而我忘了树剖怎么打(其实是代码太长不想打, ...

  7. YbtOJ#593-木棍问题【费用流】

    正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/3 题目大意 n∗mn*mn∗m的网格上有一些格子有木球,两个相邻木球直接可以有木棍. 两个L ...

  8. 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)

    正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作: 1.把一个点的权值改为当前树中的最大权值+1 2.查询一个点在删除序列中的位置 3. ...

  9. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)

    Description 数字和数学规律主宰着这个世界.   机器的运转,   生命的消长,   宇宙的进程,   这些神秘而又美妙的过程无不可以用数学的语言展现出来.   这印证了一句古老的名言:   ...

最新文章

  1. 从技术角度分析“抢票软件的加速”有多快?
  2. 如何使用charles对Android Https进行抓包
  3. MacBook Pro新版上市
  4. 配置FCKeditor_2.6.3+fckeditor-java-2.4
  5. 1.单机部署hadoop测试环境
  6. i++与++i的区别,使用实例说明
  7. 企业该怎样选择物联网卡平台,需要遵循哪些标准?
  8. VBA中对内存地址的操作
  9. 移动互联网时代的创业生存法则:快速试错,廉价失败
  10. SQL Cookbook(读书笔记)No.2
  11. endnote引用格式自定义
  12. javascript中onclick(this)用法和onclick(this.value)用法介绍
  13. K8s实战一:基本概念与命令二
  14. 中国前10名的休闲服品牌企业信息化漫谈--S公司
  15. Vue - 调用接口导出 excel 表格至本地
  16. R数据加工厂-plyr包
  17. nn.Bilinear讲解
  18. java第一个程序编译失败,零基础java第一个程序HelloWorld,编译,环境变量,运行,注释...
  19. 不是所有产品都适合做亚马逊CPC广告
  20. 将用好路缘石成型机做好公路项目的经验分享开来

热门文章

  1. set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输
  2. python中数据用折线图表示_用python处理文本数据
  3. linux删除grid数据文件,MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除...
  4. python二维列表写入excel_用Python实现合并excel列表
  5. java让对象分配在栈上_java – Hotspot何时可以在堆栈上分配对象?
  6. 安卓平板运行python_使用Python进行手机平板移动开发 | 学步园
  7. quill变html转化,将Quill Delta转换为HTML
  8. mysql os.pid_MySQL在OS El Capitan的配置[PID file error]
  9. 77. 组合016(回溯法)
  10. C++类模板中的static成员