小 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. linux系统安全设置加固

        描述 设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险 检查提示 -- 加固建议 编辑/etc/ssh/sshd_config,将ClientAliveInterval ...

  2. 使用haystack实现django全文检索搜索引擎功能

    前言 django是python语言的一个web框架,功能强大.配合一些插件可为web网站很方便地添加搜索功能. 搜索引擎使用whoosh,是一个纯python实现的全文搜索引擎,小巧简单. 中文搜索 ...

  3. 牛客 133D 挑选队友 (分治FFT)

    大意: $n$个人, 分别属于$m$个组, 要求选出$k$个人, 使得每组至少有一人, 求方案数. 显然答案为$\prod((1+x)^{a_i}-1)$的第$k$项系数, 分治$FFT$即可. #i ...

  4. ACM-ICPC 2017北京

    J. Pangu and Stones 大意: 给定$n$堆石子, $(n\le 100)$, 每次操作任选连续的至少$L$堆至多$R$堆合并, 代价为合并石子的总数, 求合并为$1$堆的最少花费. ...

  5. String的equals和hashCode方法

    对于判断对象是否相等,肯定需要重写它的equals和hashCode方法.不然使用默认的方法只会比较地址,因此会出现错误. 以String类为例,且看它的equals方法 public boolean ...

  6. VBA学习资料分享-3

    VBA创建/发送OUTLOOK邮件时怎么加上默认签名呢?用过OUTLOOK写邮件的人都知道,如果你设置了默认签名,那么在创建空白邮件的时候就会自动加上你设置的签名.根据这一特性,我们可以在用VBA创建 ...

  7. 【原创】大叔经验分享(82)logstash一个实例运行多个配置文件

    logstash一个实例运行多个配置文件,将所有配置文件放到以下目录即可 /usr/share/logstash/pipeline 但是默认行为不是每个配置文件独立运行,而是作为一个整体,每个inpu ...

  8. 安装笔记, caffe 、 opencv等

    1. 1.1 opencv static linux mkdir build & cd build cmake .. -LH  这句话用来查看编译选项  如果不知道编译啥  可以用这个查看一下 ...

  9. phpspider爬虫框架的使用

    这几天使用PHP的爬虫框架爬取了一些数据,发现还是挺方便的,先上爬虫框架的文档 phpspider框架文档 使用方法其实在文档中写的很清楚而且在demo中也有使用示例,这里放下我自己的代码做个笔记 & ...

  10. 修改一张MyISAM表row_format为fixed为InnoDB表报错处理

    最近优化GTID模式下事务表和非事务表更新报错处理时,发现某几张表更改存储引擎为InnoDB报错如下: mysql> alter table sc_xxx_video_xxxxengine = ...