【CCPC-Wannafly Winter Camp Day3 (Div1) I】石头剪刀布(按秩合并并查集)
大致题意: 有\(n\)个人,第\(i\)个人坐在编号为\(i\)的座位上,每个人等概率有石头、剪刀、布中的一张卡片。有两种操作:第一种是第\(y\)个人挑战第\(x\)个人,如果胜利则\(x\)被淘汰,\(y\)坐到\(x\)的座位上,否则\(y\)被淘汰;第二种是询问第\(x\)个人存活的概率。
一个简单的结论
考虑被别人挑战,平或胜都不会被淘汰,因此存活率为\(\frac 23\)。
考虑挑战别人,只有胜才不会被淘汰,因此存活率为\(\frac 13\)。
因此,如果有一个人被别人挑战了\(A\)次,挑战了别人\(B\)次,那么他的存活率自然就是:
\]
而存活率再乘上总情况数\(3^n\),就是所询问的答案了:
\]
考虑如何维护答案
设想当一个人挑战另一个人之后,无论是哪一种情况,二人中都必将有且仅有一人被淘汰。
所以接下来的操作需要对他们一同进行修改。
这样一来,就可以想到使用并查集来进行维护了。
但由于有修改操作,所以我们不能简单粗暴的路径压缩(其实也可以通过一个稍微麻烦点的技巧来使用路径压缩做此题),而是要用按秩合并。
我们可以对于每个节点维护它对\(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】石头剪刀布(按秩合并并查集)的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 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 ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- 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 ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 排列
题目链接:https://zhixincode.com/contest/14/problem/A?problem_id=203 time limit per test: 1 secondmemory ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)
点此看题面 大致题意:已知 \(p\)为\(n\)的一个排列,定义\(A(p)_i=min_{j=1}^ip_j\),若用\(q_i\)表示\(p\)第\(i\)小的前缀的长度(以值为第一关键字,下标 ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)
点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)
点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
随机推荐
- MB Star C5 Functions
The MB STAR C5 notion and brand combination for hardware and software program components will be the ...
- Hadoop 2.0 安装配置
1. install jdk 2. install hadoop. 安装包hadoop-2.2.0.tar.gz存放在一个目录.并解压. 3. 修改配置文件,一般配置文件在/etc/hadoop下面. ...
- oracle 12.1.0.2的mgmt 导致的ORA-01017 bug
两节点12c RAC,在两节点上export ORACLE_SID再sqlplus / as sysdba都正常登录,然而Commvault通过service_name方式(sqlplus sys/p ...
- Dockerfile的书写规则和指令的使用方法
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命 ...
- static 和 final 和 static final
众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...
- PHP用mysql数据库存储session
大部分使用php的人一旦应用到session都会使用cookie. cookie虽好可是它也会给我们带来一些隐患的. 隐患一:如果客户端机器的cookie一旦因病毒而失效了,那么session也就相当 ...
- 如何修改FlashFXP默认编辑工具使用记事本打开
FlashFXP如果不设置默认编辑工具,那么当你打开html文档的时候,默认会用word打开,很不方便,其实简单的设置下,可以默认以任何工具打开.具体设置方法如下: 选项>>关联文件. 然 ...
- pat1052. Linked List Sorting (25)
1052. Linked List Sorting (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...
- PHP substr()函数
PHP substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr() /mb_strcut的用法 ...
- pop3密码嗅探
成品与代码可在 https://pan.baidu.com/s/1MPfU2T_6YN6mgxUL0wrZxw 下载 来说下pop协议, 英文版,https://tools.ietf.org/html ...