小 X 的图
题目背景及题意
小 X 有一张图,有 n 个点(从 0 开始编号),一开始图里并没有
边,他有时候会向其中添加一条双向边(x 到 y)。小 X 会时不时想知
道某两个点是否联通,如果连通并在 t 次加边操作之前不连通,他就
会对自己加的边感到满意,否则他就会生气,并会错误地记录接下来
添加的边,将 x 记录为(x+n-c)%n ,y 记录为(y+n-c)%n。直到
他下一次询问为止。C 是一个小 X 随意定的值(一开始是 0),当然也
会随他意愿修改。
你的任务就是回答他的每一次询问
输入格式
第一行 n,m,表示点的个数和小 X 操作的总数
接下来 m 行,每行先是一个字符
“K”:接下来一个数字 c,表示小 X 新的 c 值
“R”:接下来两个整数 u,v,表示连一条双向边
“T”:接下来三个整数 u,v,t,表示询问 u 到 v 的连通性,t 的意
义上文已经提到过了
保证:无自环(但有重边
输出格式
对于每个询问输出一行“Y”代表小 X 满意,“N”代表小 X 生气
样例数据 详见 sample 文件夹
 
数据范围
对于 30%的数据 n<=1000,m<=3000
对于剩余数据:n , m<=300000
对于所有数据:0<=t<=m(但有可能向前第 t 次加边不存在
提示:做完这题你就 AK 了,是不是很开心呢
 
sol:这大概就是一道可持久化并查集裸题。虽然300000两只log看上去有点不可过,但就是过了。。。
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
inline void copy(int &x,int y,int l,int r);
inline void Build(int &x,int l,int r);
inline void Chag(int &x,int y,int l,int r,int Pos,int Val);
inline int Que(int x,int l,int r,int Pos);
int n,m,cnt=,Now;
int fa[N],sz[N];
vector<int>Jh[N];
int rt[N<<];
#define PB push_back
struct Node
{
int ls,rs,id;
}T[N*];
inline int gf(int x){return (x==fa[x])?(x):(fa[x]=gf(fa[x]));}
inline void ubbon(int x,int y)
{
int i,xx=gf(x),yy=gf(y);
if(xx==yy)
{
// cout<<"@@@@@"<<x<<' '<<y<<endl;
copy(rt[Now],rt[Now-],,n); return;
}
if(sz[xx]<sz[yy]) swap(xx,yy);
fa[yy]=xx; sz[xx]+=sz[yy];
int oo[],t=; copy(oo[t],rt[Now-],,n);
for(i=;i<Jh[yy].size();i++)
{
t^=; oo[t]=;
Chag(oo[t],oo[t^],,n,Jh[yy][i],xx);
Jh[xx].PB(Jh[yy][i]);
}
copy(rt[Now],oo[t],,n);
Jh[yy].clear();
}
inline void Build(int &x,int l,int r)
{
x=++cnt;
if(l==r)
{
T[x].id=l; return;
}
int mid=(l+r)>>;
Build(T[x].ls,l,mid); Build(T[x].rs,mid+,r);
}
inline void copy(int &x,int y,int l,int r)
{
x=y;
}
inline void Chag(int &x,int y,int l,int r,int Pos,int Val)
{
x=++cnt; T[x]=T[y];
if(l==r)
{
T[x].id=Val; return;
}
int mid=(l+r)>>;
if(Pos<=mid) Chag(T[x].ls,T[y].ls,l,mid,Pos,Val);
else Chag(T[x].rs,T[y].rs,mid+,r,Pos,Val);
}
inline int Que(int x,int l,int r,int Pos)
{
if(l==r) return T[x].id;
int mid=(l+r)>>;
if(Pos<=mid) return Que(T[x].ls,l,mid,Pos);
else return Que(T[x].rs,mid+,r,Pos);
}
int main()
{
freopen("history.in","r",stdin);
freopen("history.out","w",stdout);
int i,C=,x,y,z,Last; char S[];
R(n); R(m);
for(i=;i<=n;i++) {fa[i]=i; sz[i]=; Jh[i].PB(i);}
Build(rt[Now=],,n);
// for(i=1;i<=n;i++) cout<<Que(rt[Now],1,n,i)<<' ';
// putchar('\n');
int Test=;
while(m--)
{
scanf("%s",S+);
switch (S[])
{
case 'K':
R(C);
break;
case 'R':
R(x); R(y);
x=(x+Last*C)%n; y=(y+Last*C)%n;
x++; y++;
// cout<<"RRR"<<' '<<x<<' '<<y<<endl;
Now++;
ubbon(x,y);
break;
case 'T':
R(x); R(y); R(z);
x++; y++;
if(x==y) {puts("N"); Last=; break;}
int xx=gf(x),yy=gf(y);
if(xx==yy)
{
if(Now<z) puts("Y"),Last=;
else
{
int c1=Que(rt[Now-z],,n,x),c2=Que(rt[Now-z],,n,y);
if(c1==c2) puts("N"),Last=;
else puts("Y"),Last=;
}
}
else puts("N"),Last=;
// if(++Test==185) return 0;
break;
}
// for(i=1;i<=n;i++) cout<<Que(rt[Now],1,n,i)<<' ';
// putchar('\n');
}
return ;
}

7.19T3的更多相关文章

  1. DIY一个高大上带提醒的计时器,简单实用,你还在等什么

    小编心语:锵锵锵!小编我又来了!昨天发了一篇比较实用的<Python聊天室>,鉴于反响还不错,SO ,小编也想给大家多分享点有用的干货,让大家边学边用.好了,闲话不多说,今天要给各位看官们 ...

  2. web初学之request,session与application

    request (1)request的setAttribute()与getAttribute()方法一般都是成对出现,首先通过setAttribute()方法设置属性与属性值,然后通过getAttri ...

  3. Nginx安装(我觉得我这篇可能是全网最清晰的一篇安装步骤了)

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/46aadb8f-5 ...

随机推荐

  1. Zynq-7000 MiZ701 SOC硬件使用手册

    一.整体概述 4 二.应用领域及人群 4 三.硬件配置 4 BANK资源分配 6 四.MiZ701开发板功能描述 7 4.1 全编程SOC(All Programmable SoC) 7 4.2 内存 ...

  2. 指针生成网络(Pointer-Generator-Network)原理与实战

    指针生成网络(Pointer-Generator-Network)原理与实战   阅读目录 0 前言 1 Baseline sequence-to-sequence 2 Pointer-Generat ...

  3. 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)

    优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...

  4. HTML form表单中action的正确写法

    我的Java Web Application的context是myweb,即http://localhost:8080/myweb/index.jsp是欢迎页. 现在我的一个Controller的映射 ...

  5. StoneTab标签页CAD插件 3.2.3

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  6. http GET 和 POST 请求的优缺点和误区

    (1)post更安全(不会作为url的一部分,不会被缓存.保存在服务器日志.以及浏览器浏览记录中) (2)post发送的数据更大(get有url长度限制) (3)post能发送更多的数据类型(get只 ...

  7. PHP 获取数组指定值的位置或下标

    <?php     //定义一个数组     $array = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');     // ...

  8. 【SpringBoot】入门程序和机制分析

    一.初建项目 首先要导入SpringBoot的Maven依赖 <!-- Inherit defaults from Spring Boot --> <!-- 这是SpringBoot ...

  9. vs code 开发小程序会用到的插件

    主要介绍一下几个vscode插件,在vscode中搜索插件关键字点击安装即可. 1) vscode weapp api,  语法结构api; 2) minapp-vscode 3) vscode wx ...

  10. [转载] 关于CI,CD,jenkins

    Jenkins入门(一) https://blog.csdn.net/miss1181248983/article/details/82840006