题目传送门

思路: 

按照题意描述,所有y挑战x的关系最后会形成一棵树的结构,n个人的总方案数是 3种,假设一个人被挑战(主场作战)a次,挑战别人(客场)b次,那么这个人存活到最后的方案数就是3n*(2/3)a*(1/3)b

也就是我们知道这个a和b就可以得到答案了,那要怎么维护呢。

这里用到并查集(jls niub!)

我们用w表示一个节点总共比赛的场次数,v表示主场作战的场次数,如果我们现在把y这个集合并向x这个集合(y挑战x),那么对于XW和Xv肯定都加一,而Yw也加一,如果我们接下来能很好的合并这些信息,那我们就AC了。

这里想了很久,才想明白要怎么做。我们先考虑暴力一点的并查集,就是不路径压缩,那每个节点就可以向上把所有父节点的信息全部加起来,就是我们最后要的某一个节点的W和V了,但是这样做会TLE,因为我们没有路径压缩,查找的时间复杂度很可能退化成O(n),但是我们又不能路径压缩(为什么不行,大家可以尝试一下,反正我自闭了一下午加一晚上)。

普通的带权并查集我们用的都是路径压缩版本的,而这里我们要按秩合并,这样查找的时间复杂度就可以被优化到O(logn)。

曾经我一直以为带权并查集的路径压缩和按秩合并是同一个东西,这道题真的学到了。。

#include<bits/stdc++.h>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
int fa[maxn],Rank[maxn];
ll w[maxn],v[maxn];
int n,m;
int op,x,y;
ll p= ;
struct node{
int fx;
ll w,v;
};
ll qpow(ll a,ll b){
a%=p;
ll res=;
while(b>)
{
if(b&){
res*=a;
res%=p;
}
b>>=;
a=a*a%p;
}
return res;
}
void init(){
for(int i=;i<=n;i++){
fa[i]=i;
w[i]=;
v[i]=;
Rank[i]=;
}
}
node find(int x){
if(x==fa[x]) return {fa[x],w[x],v[x]}; int tep=fa[x];
node e;
e.w=w[x],e.v=v[x];
while(tep!=fa[tep]){
e.w+=w[tep],e.v+=v[tep];
tep=fa[tep];
}
e.fx=tep;
e.v+=v[tep],e.w+=w[tep];
return e;
} void baba(int x,int y){
node ex=find(x),ey=find(y);
if(ex.fx!=ey.fx){
w[ex.fx]+=;
v[ex.fx]+=;
w[ey.fx]+=;
v[ey.fx]+=;
if(Rank[ex.fx]>=Rank[ey.fx])
{
w[ey.fx]-=w[ex.fx];
v[ey.fx]-=v[ex.fx];
fa[ey.fx]=ex.fx;
Rank[ex.fx]++;
}else{
w[ex.fx]-=w[ey.fx];
v[ex.fx]-=v[ey.fx];
fa[ex.fx]=ey.fx;
Rank[ey.fx]++;
} }
}
int main(){
while(cin>>n>>m)
{
init();
ll res=qpow(,n);
ll ans;
while(m--)
{
scanf("%d%d",&op,&x);
if(op==){
scanf("%d",&y);
baba(x,y);
}else{
node ex=find(x);
ll a=ex.v;
ll b=ex.w-ex.v;
ans=res*qpow(qpow(,b),p-)%p*qpow(,a)%p*qpow(qpow(, a),p-)%p;
printf("%lld\n",ans);
}
}
}
}

题目描述

可怜去观看了石头剪刀布的世界最高赛事 WRSP。

今年的比赛一共有 n 名选手参加,在比赛开始时,每名选手都会收到一张卡片,这张卡片上写着剪刀、石头、布中的一个。显然初始的卡牌分配情况有 3^n种。

比赛场地一共有 n 个座位,最开始第 ii 个选手坐在第 i 个座位上。

接下来发生了 m 个事件,事件有两种:

  • 1 x y,主办方撤去了第 yy 个座位,原来在第 yy 个座位上的选手 bb 需要和 xx 个座位上的选手 aa 利用他们的卡片进行一场石头剪刀布比赛,如果 bb 赢了 aa,则选手 aa 被淘汰,选手 bb 坐到第 x 个座位上;否则(打平或者 bb 输了),则选手 bb 被淘汰,选手 aa 的坐位不变。
  • 2 x,可怜提出了一个问题,她想要知道在进行了之前的所有第 1 类事件后,有多少种卡牌分配情况可以让第 x 个选手到现在还没有被淘汰。
 
 

输入描述

第一行输入两个整数 n,m(1 \leq n,m \leq 2 \times 10^5)n,m(1≤n,m≤2×105),表示选手个数和事件个数。

接下来 mm 行,每行描述了一个事件。如果是第一类事件,则输入三个整数 1\ x\ y(1 \leq x,y \leq n, x \neq y)1 x y(1≤x,y≤n,x̸​=y) 且这两个座位在之前没有被撤去;如果是第二类事件,则输入两个整数 2\ x(1 \leq x \leq n)2 x(1≤x≤n)。

输出描述

对于每个第二类事件,输出一行一个整数,表示这个选手还没有被淘汰的分配情况个数对 998244353998244353 取模后的值。

样例输入 1

3 5
2 1
1 2 1
2 1
1 2 3
2 1

样例输出 1

27
9
6

石头剪刀布(2019Wannafly winter camp day3 i) 带权并查集+按秩合并 好题的更多相关文章

  1. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  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. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  4. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  5. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  6. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  7. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

  8. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...

  9. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

随机推荐

  1. linux下scsi共享磁盘的简单搭建

    linux下scsi共享磁盘的简单搭建 Scsi 共享磁盘需要我先有空余的分区,或者可以在虚拟机里面添加一块磁盘,安装所需的软件我在虚拟机里面添加了一块硬盘,分了一个主分区,sdb1 1G,将这个用s ...

  2. Luogu 4284 [SHOI2014]概率充电器

    BZOJ 3566 树形$dp$ + 概率期望. 每一个点的贡献都是$1$,在本题中期望就等于概率. 发现每一个点要通电会在下面三件事中至少发生一件: 1.它自己通电了. 2.它的父亲给它通电了. 3 ...

  3. App测试从入门到精通之App分类和场景操作系统

    App概要 APP是application的缩写.通常指的是手机软件上的应用,或称为手机客户端.手机app就是手机的应用程序.随着智能手机的越发普及,用户越发依赖手机软件商品店,app开发的需求与发展 ...

  4. 编写高质量代码改善C#程序的157个建议——建议59:不要在不恰当的场合下引发异常

    建议59:不要在不恰当的场合下引发异常 常见的不易于引发异常的情况是对在可控范围内的输入和输出引发异常. private void SaveUser3(User user) { ) { throw n ...

  5. 关于IIS配置SimpleHandlerFactory-Integrated在其模块列表中有一个错误模块ManagedPipelineHandler的错误处理

    解决方法: 使用管理员运行aspnet_regiis.exe 命令:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i v ...

  6. Linux 命令之chcon

    chcon命令:修改对象(文件)的安全上下文.比如:用户:角色:类型:安全级别.主要用在selinux中用来更改安全上下文.命令格式: Chcon [OPTIONS…] CONTEXT FILES…. ...

  7. 以太坊系列之十二: solidity变量存储

    solidity中变量的存储 变量存储主要分为两个区域,一个是storage(对应指定是SLOAD,SSTORE),一个是Memory(MLOAD,MSTORE), 这和普通编程语言的内存模型是不一样 ...

  8. day1学python Hello Python

    Hello Python 本人使用的是Pycharm编译器 ----------------------------------------------- 1.输出 2.赋值 3.‘’‘/“”“ 多行 ...

  9. Django 使用第三方服务发送电子邮件

    在 Django 网站中使用 mailgun 的邮件收发服务. 1.在 mailgun 官网上注册个账号(免费,免费账号每个月有10000条收发邮件的服务,对我来说已经完全够用了),注册完成后界面如图 ...

  10. 运行Scrapy工程,报错ModuleNotFoundError: No module named 'win32api'解决方法

    1.运行爬虫scrapy crawl name,报错ScrpyModuleNotFoundError: No module named 'win32api' 2.解决方法: 在https://gith ...