小 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. 怎样获取所有style节点

    通过 document.styleSheets 获取所有的样式表节点. document.styleSheets instanceof StyleSheetList; // true 注意: 1. 返 ...

  2. Unsupported major.minor version 52.0错误和 jdbc odbc

    什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...

  3. multer使用

    使用multer 1.      在项目中下载multer操作模块 Npm install multer  --save 前端代码: <form class="layui-form&q ...

  4. 解决设置了display:none的元素,会先展示再隐藏

    问题:元素明明设置了display:none,但是在刷新页面的时候却会先显示了出来,然后才会隐藏,实现display:none 原因:由于元素渲染的时候,样式还没有应用上去,导致的 解决办法:使用内联 ...

  5. asp.net frameworke处理程序的作用

    1 向客户端发送响应的工作都由处理程序完成 2 任何实现System.web.ihttpHandler接口的类都可以作为传入的http请求的目标 3 如果需要重复使用自定义处理程序对象,需要创建自定义 ...

  6. 7.SpringMVC 配置式开发-ModelAndView和视图解析器

    ModelAndView 1.Model(模型) 1.model的本质就是HashMap,向模型中添加数据,就是往HashMap中去添加数据 2.HashMap 是一个单向查找数组,单向链表数组 3. ...

  7. 9.EL表达式 和 JSTL核心标签库

    EL表达式 1./*获取数据*/ (某个web域中的对象,访问javabean的属性.访问List集合.访问Map集合.访问数组) <html> <head> <titl ...

  8. ASE19团队项目alpha阶段model组 scrum5 记录

    本次会议于11月7日,19时整在微软北京西二号楼sky garden召开,持续12分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing W ...

  9. Dart的导包

    Dart中的库主要有三种: 1.我们自定义的库 import 'lib/xxx.dart'; 2.系统内置库 import 'dart:math'; import 'dart:io'; import ...

  10. Linux磁盘及文件系统管理4

    文件系统的使用: 首先要“挂载”:mount命令和umount命令 根据文件系统之外的其它文件系统要想能够被访问,都必须通过“关联”到根文件系统上的某个目录来实现,此关联操作即为“挂载”:此目录即为“ ...