小 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. 怎样理解"不推荐不使用var的变量声明方式"这句话

    答: 因为不使用var声明的变量不会被预解析, 如下: console.log(a); console.log(b); var a = 1; b = 2;

  2. Scala学习十三——集合

    一.本章要点 所有集合都扩展自Iterable特质; 集合有三大类,分别为序列,集和映射; 对于几乎所有集合类,Scala都同时提供可变和不可变的版本; Scala列表要么是空的,要么拥有一头一尾,其 ...

  3. java lesson10homework

    1.    输入三个整数x, y, z,请把这三个数由小到大输出. 2.  package Homework10; 3.  //:类方法 4.  public class Sort { 5.  voi ...

  4. 使用.Net Core 2.2创建windows服务

    使用.Net Core 2.2创建windows服务 我的环境 win 10 home Visual Studio 2019 v16.1.3 安装有.net core 2.2 创建项目 编辑项目文件 ...

  5. JSON格式互转集合 (2)

    public class JSON { public static string DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss"; ...

  6. docker 第五篇 存储

    镜像概述复习 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层 如果运行中的容器修改了现有的一个已经存在的文件,那改文件将会从读写层下面的只读 ...

  7. Image Processing and Computer Vision_Review:A survey of recent advances in visual feature detection—2014.08

    翻译 一项关于视觉特征检测的最新进展概述——http://tongtianta.site/paper/56761 摘要 -特征检测是计算机视觉和图像处理中的基础和重要问题.这是一个低级处理步骤,它是基 ...

  8. SELinux 了解及CentOS7 中 semanage命令的安装

    SELinux 安全子系统 SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access ...

  9. php函数copy和rename的区别

    copy ( string source, string dest )将文件从 source 拷贝到 dest.如果成功则返回 TRUE,失败则返回 FALSE. 如果要移动文件的话,请用 renam ...

  10. SSH环境搭建之Spring环境搭建篇

    SSH环境搭建之Spring环境搭建篇 一.引入Spring所使用的JAR文件 二.在src目录下创建beans.xml(Spring的容器文件) <?xml version="1.0 ...