Description

Solution

套路题...

全他娘的是套路...

首先如何处理仙人掌,可以在线拿 \(lct\) 维护,或者离线之后树剖。(\(lct\) 维护太毒了写不来,就离线树剖了又好写又不用调

离线树剖的意思就是按加边时间为权值建出一棵最小生成树(或者生成森林),这就是最终的仙人掌的一棵生成树了。

加边的时候如果这是条树边那就直接加上,如果不是树边,那就在线段树上查一下这个环是否有边被覆盖,只要有一条边被覆盖那就不满足仙人掌性质,那就不能加这条边进去,否则加进去然后线段树区间赋值就好了。

然后怎么求期望联通块数?

如果这是个森林的话,期望联通块数=期望点数-期望边数

那要是个沙漠呢?

考虑一下森林的这个式子是怎么来的,就是最开始有点数个联通块,然后每加一条边就合并两个联通块,所以是点数-边数。

那放到仙人掌上,发现每条形成环的非树边都被多减了一次,那再加回来就好了。而成环的非树边就恰好等于仙人掌的环数,因为一条边最多只会出现在一个环里。所以沙漠的期望联通块数=期望点数-期望边数+期望环数。

然后分开考虑就好了,因为点还有颜色,那我们规定一条边是白的当且仅当两端点都是白色,一个环是白的当且仅当环上的所有点都是白色。黑色同理。

先算点数。根据期望的线性性,一个点是白色点的概率就是 \((\frac{n-1}n)^t\),那对期望的贡献就是 \(1\cdot (\frac{n-1}n)^t\) ,黑色点拿 \(1\) 减一下就行了。

再算边数。一条边是白色边的概率是 \((\frac{n-2}n)^t\) ,是黑色边的概率容斥一下,就是 \(2\cdot(1-(\frac{n-1}n)^t)-(1-(\frac{n-2}n)^t)=1+(\frac{n-2}n)^t-2\cdot (\frac{n-1}n)^t\) ,含义画一个Venn图就很清楚了。

然后是环数,白色环的概率很好算,就是 \((\frac{n-len}n)^t\),其中 \(len\) 是环长。那黑色环呢,也是容斥一下,枚举至少有 \(j\) 个白点,所以 \(f(len)=\sum\limits_{j=0}^{len} (-1)^j \cdot C_{len}^j\cdot (\frac{n-j}n)^t\) 。

嗯然后就做完了。

Code

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using std::swap;
typedef long long ll;
#define int long long
const int N=3e5+5;
const int mod=998244353;int n,m,t,w;
int fac[N],ifac[N];
int cnt,head[N],is[N];
int father[N],ques[N][2];struct Edge{int to,nxt;
}edge[N<<1];void add(int x,int y){edge[++cnt].to=y;edge[cnt].nxt=head[x];head[x]=cnt;
}namespace slpf{#define ls x<<1#define rs x<<1|1#define lss ls,l,mid,ql,qr#define rss rs,mid+1,r,ql,qrint sze[N],son[N],fa[N];    int flag[N<<2],sum[N<<2];int tot,dfn[N],top[N],d[N];void dfs(int now){sze[now]=1;for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;if(sze[to]) continue;fa[to]=now;d[to]=d[now]+1;dfs(to);sze[now]+=sze[to];son[now]=sze[to]>sze[son[now]]?to:son[now];}}void dfs2(int now,int low){dfn[now]=++tot;top[now]=low;if(son[now]) dfs2(son[now],low);for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;if(dfn[to]) continue;dfs2(to,to);}}void pushup(int x){sum[x]=sum[ls]|sum[rs];}void pushdown(int x){if(!flag[x]) return;flag[ls]=flag[rs]=sum[ls]=sum[rs]=1;flag[x]=0;}void modify(int x,int l,int r,int ql,int qr){if(ql<=l and r<=qr) return flag[x]=sum[x]=1,void();pushdown(x);int mid=l+r>>1;if(ql<=mid) modify(lss);if(mid<qr) modify(rss);pushup(x);}int query(int x,int l,int r,int ql,int qr){if(ql<=l and r<=qr) return sum[x];pushdown(x);int mid=l+r>>1,ans=0;if(ql<=mid) ans|=query(lss);if(mid<qr) ans|=query(rss);return ans;}int ask(int x,int y){int ans=0;while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);ans|=query(1,1,n,dfn[top[x]],dfn[x]);x=fa[top[x]];} if(d[x]<d[y]) swap(x,y);if(x!=y) ans|=query(1,1,n,dfn[y]+1,dfn[x]);return ans;}int change(int x,int y){while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);modify(1,1,n,dfn[top[x]],dfn[x]);x=fa[top[x]];} if(d[x]<d[y]) swap(x,y);if(x!=y) modify(1,1,n,dfn[y]+1,dfn[x]);return y;}
}int ksm(int a,int b=mod-2,int ans=1){while(b){if(b&1) ans=ans*a%mod;a=a*a%mod; b>>=1;} return ans;
}int getint(){int X=0,w=0;char ch=getchar();while(!isdigit(ch))w|=ch=='-',ch=getchar();while( isdigit(ch))X=X*10+ch-48,ch=getchar();if(w) return -X;return X;
}int find(int x){return father[x]==x?x:father[x]=find(father[x]);
}int dec(int x,const int &y){return x-y<0?x-y+mod:x-y;
}int C(int n,int m){return fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}signed main(){freopen("cactus.in","r",stdin);freopen("cactus.out","w",stdout);gi(n),gi(m),gi(t),gi(w);fac[0]=ifac[0]=1;for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;ifac[n]=ksm(fac[n]);for(int i=n-1;i;i--) ifac[i]=ifac[i+1]*(i+1)%mod;for(int i=1;i<=n;i++) father[i]=i;int invn=ksm(ksm(n),t),baid=ksm(n-1,t)*invn%mod,baib=ksm(n-2,t)*invn%mod,heib=(baib-baid*2%mod+1+mod)%mod;for(int i=1;i<=m;i++){gi(ques[i][0]),gi(ques[i][1]);int r1=find(ques[i][0]),r2=find(ques[i][1]);if(r1!=r2) father[r1]=r2,is[i]=1,add(ques[i][0],ques[i][1]),add(ques[i][1],ques[i][0]);} for(int i=1;i<=n;i++) if(!slpf::dfn[i]) slpf::d[i]=1,slpf::dfs(i),slpf::dfs2(i,i);int ans=(w==1?n:baid*n%mod);for(int i=1;i<=m;i++){if(is[i]){ans=dec(ans,baib);if(w==1) ans=dec(ans,heib);} else{if(!slpf::ask(ques[i][0],ques[i][1])){int z=slpf::change(ques[i][0],ques[i][1]);ans=dec(ans,baib);if(w==1) ans=dec(ans,heib);int len=slpf::d[ques[i][0]]+slpf::d[ques[i][1]]-slpf::d[z]*2+1;(ans+=ksm(n-len,t)*invn%mod)%=mod;if(w==1){int res=0;for(int j=0;j<=len;j++)(res+=(j&1?mod-C(len,j):C(len,j))*ksm(n-j,t)%mod*invn%mod)%=mod;(ans+=res)%=mod;}}} print(ans),putc('\n');} return io::flush(),0;
}

转载于:https://www.cnblogs.com/YoungNeal/p/10292029.html

[JZOJ5987] 仙人掌毒题相关推荐

  1. JZOJ 5987. 【WC2019模拟2019.1.4】仙人掌毒题

    Description Input 输入文件cactus .in 第一行4个空格隔开的整数n,m,t,w 接下来m行,每行两个空格隔开的整数u,v,表示m次加边操作. Output 输出文件为cact ...

  2. [bzoj1023][SHOI2008]cactus仙人掌图【仙人掌】

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1023 [题解] 仙人掌入门题,拿圆方树练练手. 圆方树就是把一个环建一个新方点,然后向 ...

  3. 2019年二月刷题列表

    Preface 虽然二月剩下没多少了,但是为了勉强保持格式还是写一写吧 这个月的首要目标就是在剩下的时间里让这个月的做题数争取达到\(50\),不过感觉希望渺茫啊 初三中考百天倒计时要来了,所以为此我 ...

  4. BZOJ1023[SHOI2008]cactus仙人掌图 【仙人掌DP】

    题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说 ...

  5. 白白的(baibaide)

    白白的(baibaide) 有一个长度为 $n$ 的序列 $a_1, a_2, \dots, a_n$,一开始每个位置都是白色.如果一个区间中每个位置都是白色,则称这是一个白白的区间.如果一个白白的区 ...

  6. CSP2019洛谷P5666:树的重心

    解析 毒题 细节有亿点点多 我一开始的思路是没有问题的 尝试统计有多少种方案能砍出大小在一个区间的子树. 当时的想法是线段树合并 但是这个玩意在需要保留原树的情况下空间复杂度炸没了- 因为我垃圾的实现 ...

  7. 【简】题解 吉首大学第十一届“新星杯”大学生程序设计大赛

    传送门:OJ OJ 前言 A K题的大模拟实在写不动了 摸掉了(其实是其他作业叠太多了)等有空了再说吧 写得太烂  大佬们请不要介意 问题 A 咱俩下象棋去: 给你一个象棋盘  棋子的个数可能跟普通的 ...

  8. [BZOJ]1017 魔兽地图DotR(JSOI2008)

    BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...

  9. 【学习笔记+习题集】(树状数组)(9473字)

    目录 板块一:树状数组 引子:lowbit 1.存入数据(单点修改) 2.区间查询 练习1:hdoj1541 3.区间修改和单点查询(差分数组) 练习1:hdoj 1556 练习2:洛谷P3368 4 ...

  10. Before NOIP 2018

    目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...

最新文章

  1. 一个6年iOS程序员的工作感悟,送给还在迷茫的你
  2. RT600之Mailbox
  3. 使用Jedis出现Connection refused的解决方案
  4. 深入::first-letter的研究
  5. Abbirb120型工业机器人_ABB IRB 120工业机器人.pdf
  6. easyui validatebox设置默认值时 去掉校验
  7. 为什么 MapReduce 再次流行起来了?
  8. 【设计模式】适配器模式
  9. jQuery UI Autocomplete 使用 ajax 方法传输Json数据出现乱码问题的解决
  10. Python实现支持人机对战的五子棋软件(超详细)
  11. 网络安全协议(三)--基本安全协议
  12. apache commons fileupload 团队
  13. VR+文旅景区结合VR主题乐园VR设备厂家
  14. 基于Java的航空售票管理系统
  15. OA系统都能为企业带来什么
  16. IE浏览器实现打印预览
  17. 可以在linux下运行的u盘制作工具,启动U盘创建工具(LiLi USB Creator)
  18. 2021年11月线上消费信贷市场用户洞察:头部效应明显,绿色金融成新风口
  19. 架构就是bull shit
  20. python3.6怎么安装linux_linux安装python3.6

热门文章

  1. nginx: [error] OpenEvent(“Global\ngx_reload_7652“) failed (2: The system cannot find the file specif
  2. QModelIndex/Role/Model介紹 二
  3. 去掉鼠标右键文件时的“百度一下这个文件”菜单命令
  4. 50个漂亮的页面导航设计
  5. PowerBI系列之什么是PowerBI
  6. 描述一下普适计算时代中的计算机,浅析普适计算及其应用.doc
  7. 判别机器大小端,打印int的二进制
  8. 中铁建工集团安装公司基于BIM物资施工运维系统由橄榄山软件研发完成
  9. 地理信息系统GIS基础知识
  10. unity 模型销毁_Unity中销毁游戏对象的方式