【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)
可持久化并查集
显然是可持久化并查集裸题吧。。。
就是题面长得有点恶心,被闪指导狂喷。
对于\(K\)操作,直接\(O(1)\)赋值修改。
对于\(R\)操作,并查集上直接连边。
对于\(T\)操作,先询问当前是否连通,若联通再询问\(t\)次操作前是否连通。
代码
#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 300000
#define LN 20
#define swap(x,y) (x^=y^=x^=y)
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 tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void readc(Ty& x) {W(isspace(x=tc()));}
}F;
class PersistentUnionFindSet//可持久化并查集
{
private:
#define LT l,mid,O[rt].S[0]
#define RT mid+1,r,O[rt].S[1]
int n,Nt,Rt[N+5];struct node {int f,g,S[2];}O[N*LN<<1];
I int getfa(CI rt,CI x) {RI t=Qry(x,1,n,rt);return O[t].f^x?getfa(rt,O[t].f):t;}//找祖先
I void Build(CI l,CI r,int& rt)//建树
{
if(rt=++Nt,l==r) return (void)(O[rt].f=l);RI mid=l+r>>1;
Build(LT),Build(RT);
}
I int Qry(CI x,CI l,CI r,CI rt)//询问
{
if(!rt) return 0;if(l==r) return rt;RI mid=l+r>>1;
return x<=mid?Qry(x,LT):Qry(x,RT);
}
I void Upt(CI x,CI f,CI l,CI r,int& rt)//修改父亲
{
if(O[++Nt]=O[rt],rt=Nt,l==r) return (void)(O[rt].f=f);RI mid=l+r>>1;
x<=mid?Upt(x,f,LT):Upt(x,f,RT);
}
I void Add(CI x,CI l,CI r,int& rt)//将深度加1
{
if(O[++Nt]=O[rt],rt=Nt,l==r) return (void)++O[rt].g;RI mid=l+r>>1;
x<=mid?Add(x,LT):Add(x,RT);
}
public:
I void Init(CI _n) {Build(1,n=_n,Rt[0]);}
I bool Identify(CI v,CI x,CI y) {return getfa(Rt[v],x)==getfa(Rt[v],y);}//判断是否连通
I void Union(CI v,CI x,CI y)//按秩合并
{
Rt[v]=Rt[v-1];RI fx=getfa(Rt[v],x),fy=getfa(Rt[v],y);if(fx==fy) return;
O[fx].g<O[fy].g&&swap(fx,fy),Upt(O[fy].f,O[fx].f,1,n,Rt[v]),
O[fx].g==O[fy].g&&(Add(O[fx].f,1,n,Rt[v]),0);
}
}U;
int main()
{
freopen("history.in","r",stdin),freopen("history.out","w",stdout);
RI Qt,x,y,z,k=0,op=0,cnt=0;char t;F.read(n,Qt),U.Init(n);W(Qt--) switch(F.readc(t),t)
{
case 'K':F.read(x),k=x;break;//K操作
case 'R':F.read(x,y),U.Union(++cnt,(x+op*k)%n+1,(y+op*k)%n+1);break;//R操作
case 'T'://T操作
if(F.read(x,y,z),++x,++y,x==y||!U.Identify(cnt,x,y)) {puts("N"),op=1;continue;}
cnt<=z||!U.Identify(cnt-z,x,y)?(puts("Y"),op=0):(puts("N"),op=1);break;
}return 0;
}
【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)的更多相关文章
- 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)
树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...
- 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)
打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...
- 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)
没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...
- 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...
- 【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)
数位\(DP\) 首先考虑二进制数\(G(i)\)的一些性质: \(G(i)\)不可能有连续两位第\(x\)位和第\(x+1\)位都是\(1\).因为这样就可以进位到第\(x+2\)位.其余情况下,这 ...
- 2019.7.26 NOIP 模拟赛
这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...
- 【NOIP模拟赛】小奇挖矿 2
[题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0 ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
- 神奇的NOIP模拟赛 T3 LGTB 玩THD
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
随机推荐
- delphi使用Foxit Quick PDF Library读写pdf文本和图片
简介: Debenu Quick PDF Library(PDF编程开发工具)提供一套全方位的 PDF API 函数,帮助您快速简便地处理 PDF 文件.从文档属性的基本操作到创建您自己的 PDF 查 ...
- cesium 圆圈警戒扫描(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- Java学习笔记--线程day01
线程的概念:一个线程是进程的顺序执行流: 同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈.线程在切换时负荷小,因此,线程也被称为轻负荷进程.一个进程中可以有多个线程. ...
- Nginx 简介与安装、常用的命令和配置文件
1.nginx 简介(1)介绍 nginx 的应用场景和具体可以做什么事情 (2)介绍什么是反向代理 (3)介绍什么是负载均衡 (4)介绍什么是动静分离 2.nginx 安装(1)介绍 nginx 在 ...
- 逻辑卷管理器LVM
逻辑卷管理器LVM •将设备指定为物理卷 • 用一个或者多个物理卷来创建一个卷组 • 物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的 • 在物理卷上创建的逻辑卷是由物理区 ...
- python serial模块使用,是pyserial而非serial
import serial from serial.tools.list_ports import comports 运行这两句时分别遇到错误 第一个先提示 no module name of ser ...
- [译]Vulkan教程(21)顶点input描述
[译]Vulkan教程(21)顶点input描述 Vertex input description 顶点input描述 Introduction 入门 In the next few chapters ...
- BOM介绍以及方法
BOM介绍和window对象的方法 一.BOM对象 (浏览器对象模型 BOM) 1.window alert() confirm() prompt() setInterval() setTimeo ...
- JavaScript定时器方法
一.setTimeout() 延迟性操作 window.setTimeout(function(){ console.log('派大星');//延迟了4秒 },4000); console.log(' ...
- Thymeleaf实现页面静态化
如果用户所有的请求,都需要Thyleaf渲染后直接返回给用户,后台就存在大量的查询操作,数据库的压力就会骤然上升,请求的时间就会延长,带来极不好用户体验,现在市面上流行的就是页面的静态化处理,下面就来 ...