点此看题面

大致题意: 有\(n\)个人,第\(i\)个人坐在编号为\(i\)的座位上,每个人等概率有石头、剪刀、布中的一张卡片。有两种操作:第一种是第\(y\)个人挑战第\(x\)个人,如果胜利则\(x\)被淘汰,\(y\)坐到\(x\)的座位上,否则\(y\)被淘汰;第二种是询问第\(x\)个人存活的概率。

一个简单的结论

考虑被别人挑战,平或胜都不会被淘汰,因此存活率为\(\frac 23\)。

考虑挑战别人,只有胜才不会被淘汰,因此存活率为\(\frac 13\)。

因此,如果有一个人被别人挑战了\(A\)次,挑战了别人\(B\)次,那么他的存活率自然就是:

\[(\frac 23)^A*(\frac 13)^B=\frac{2^A}{3^A}\cdot\frac1{3^B}=\frac{2^A}{3^{A+B}}
\]

而存活率再乘上总情况数\(3^n\),就是所询问的答案了:

\[3^n*\frac{2^A}{3^{A+B}}=3^{n-A-B}*2^A
\]

考虑如何维护答案

设想当一个人挑战另一个人之后,无论是哪一种情况,二人中都必将有且仅有一人被淘汰。

所以接下来的操作需要对他们一同进行修改。

这样一来,就可以想到使用并查集来进行维护了。

但由于有修改操作,所以我们不能简单粗暴的路径压缩(其实也可以通过一个稍微麻烦点的技巧来使用路径压缩做此题),而是要用按秩合并

我们可以对于每个节点维护它对\(A\)和\(B\)两个值造成的变化量,然后查询时不停向上跳即可。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
#define X 998244353
#define swap(x,y) (x^=y^=x^=y)
#define Qinv(x) Qpow(x,X-2)
using namespace std;
int n;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn(x) (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn(x)+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
class UnionFindSet//并查集
{
private:
static const int SZ=N;int f[SZ+5],g[SZ+5],A[SZ+5],B[SZ+5];
I int getfa(CI x) {return f[x]^x?getfa(f[x]):x;}//找祖先
public:
I void Init(CI n) {for(RI i=1;i<=n;++i) g[f[i]=i]=1;}//初始化
I void Union(RI x,RI y)//合并A和B
{
if(!((x=getfa(x))^(y=getfa(y)))) return;//如果祖先相同,则退出函数(理论上来说不会出现这种情况)
++A[x],++B[y],g[x]<g[y]&&swap(x,y),//将x被挑战次数的变化量加1,将y挑战次数的变化量加1,将深度较大的节点作为x
A[y]-=A[f[y]=x],B[y]-=B[x],!(g[x]^g[y])&&++g[x];//将y的两个变化量减去x的两个变化量,然后合并
}
I void Operate(CI x,int& a,int& b) {f[x]^x&&(Operate(f[x],a,b),0),a+=A[x],b+=B[x];}//求出x的两个变化量
}U;
I int Qpow(RI x,RI y) {RI res=1;W(y) y&1&&(res=1LL*res*x%X),x=1LL*x*x%X,y>>=1;return res;}//快速幂
int main()
{
RI Qtot,i,op,x,y,A,B;F.read(n,Qtot),U.Init(n);W(Qtot--)
{
if(F.read(op,x),op^1) A=B=0,U.Operate(x,A,B),F.writeln(1LL*Qpow(3,n-A-B)*Qpow(2,A)%X);//对于询问,求解并输出答案
else F.read(y),U.Union(x,y);//对于一次挑战,合并两个节点
}
return F.clear(),0;
}

【CCPC-Wannafly Winter Camp Day3 (Div1) I】石头剪刀布(按秩合并并查集)的更多相关文章

  1. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  2. CCPC-Wannafly Winter Camp Day3 Div1 - 石头剪刀布 - [带权并查集]

    题目链接:https://zhixincode.com/contest/14/problem/I?problem_id=211 样例输入 1  3 5 2 1 1 2 1 2 1 1 2 3 2 1 ...

  3. Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的 ...

  4. CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]

    题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1  5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...

  5. CCPC-Wannafly Winter Camp Day3 Div1 - 排列

    题目链接:https://zhixincode.com/contest/14/problem/A?problem_id=203 time limit per test: 1 secondmemory ...

  6. 【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)

    点此看题面 大致题意:已知 \(p\)为\(n\)的一个排列,定义\(A(p)_i=min_{j=1}^ip_j\),若用\(q_i\)表示\(p\)第\(i\)小的前缀的长度(以值为第一关键字,下标 ...

  7. 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)

    点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...

  8. 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)

    点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...

  9. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

随机推荐

  1. sofa-boot(1)helloworld项目

    本示例参考:https://www.sofastack.tech/sofa-boot/docs/QuickStart 示例采用sofa-boot 3.1.1版本. 如下步骤: 1.进入https:// ...

  2. 普通用户不能使用sudo命令的解决办法

    普通用户不能使用sudo命令的解决办法 https://www.cnblogs.com/fasthorse/p/5949946.html 1. 切换到root用户下:su – root 2. 给/et ...

  3. Django media的设置

    django在定义模型时需要一些上传的文件,例如图片 class Banner(models.Model): """ 轮播图models titles 标题 images ...

  4. Tab 插件(一)

    前言 使用Jquery封装插件,使代码复用不需要每个功能重新编写代码只需修改传入参数. jQuery 插件常见到有类开发 和对象开发模式, 在下边介绍两种模式使用,初次编写,有误拍砖. jQuery ...

  5. 2019.03.21 读书笔记 基元类型的Parse与TryParse 性能与建议

    Parse转换失败时会抛出异常,耗损性能,如果转换成功,则与TryParse无差异.查看源码,tryparse的代码更多一些,在失败时,反而性能更优,主要是抛出异常耗损了性能.所以在不确定是用Tryp ...

  6. CAD安装失败怎样卸载CAD 2009?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  7. C# 进一取整

    C#: // "/"号现在整形运算是取整,浮点运算时为除法运算 Console.WriteLine("(56/10):{0}", 56 / 10);//5 Co ...

  8. pat1091. Acute Stroke (30)

    1091. Acute Stroke (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One impo ...

  9. mysql操作命令梳理(3)-pager

    在mysql日常操作中,妙用pager设置显示方式,可以大大提高工作效率.比如select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到,这时候使用pager可以设置调用os的more或者l ...

  10. 斗鱼扩展--notifications提示(十二)

    来说下 桌面通知 Notification,HTML5支持 Web Notifications 的实例,但是要经过用户允许,  chrome://settings/content/notificati ...