【bzoj4229】选择 离线+LCT
题目描述
输入
输出
样例输入
7 8 7
1 2
1 3
1 4
2 3
3 4
3 7
7 4
5 6
Z 1 4
P 1 3
P 2 4
Z 1 3
P 1 3
Z 6 5
P 5 6
样例输出
Yes
Yes
No
No
题解
离线+LCT
删边很难处理,考虑离线,时间倒流,把删边变为加边处理。
那么问题就转化为 【bzoj4998】星球联盟 。
使用LCT,加边时如果属于同一连通块,则把路径上的点缩成一个边双。并使用并查集维护边双。
时间复杂度 $O(LCT·n\log n)$
#include <set>
#include <cstdio>
#define N 100010
using namespace std;
set<pair<int , int> > s;
int fc[N] , fv[N] , fa[N] , c[2][N] , rev[N] , px[N] , py[N] , opt[N] , qx[N] , qy[N] , ans[N];
char str[5];
int findc(int x)
{
return x == fc[x] ? x : fc[x] = findc(fc[x]);
}
int findv(int x)
{
return x == fv[x] ? x : fv[x] = findv(fv[x]);
}
inline void pushdown(int x)
{
if(rev[x])
{
swap(c[0][c[0][x]] , c[1][c[0][x]]) , rev[c[0][x]] ^= 1;
swap(c[0][c[1][x]] , c[1][c[1][x]]) , rev[c[1][x]] ^= 1;
rev[x] = 0;
}
}
inline bool isroot(int x)
{
return c[0][findv(fa[x])] != x && c[1][findv(fa[x])] != x;
}
void update(int x)
{
if(!isroot(x)) update(findv(fa[x]));
pushdown(x);
}
inline void rotate(int x)
{
int y = findv(fa[x]) , z = findv(fa[y]) , l = (c[1][y] == x) , r = l ^ 1;
if(!isroot(y)) c[c[1][z] == y][z] = x;
fa[x] = z , fa[y] = x , fa[c[r][x]] = y , c[l][y] = c[r][x] , c[r][x] = y;
}
inline void splay(int x)
{
int y , z;
update(x);
while(!isroot(x))
{
y = findv(fa[x]) , z = findv(fa[y]);
if(!isroot(y))
{
if((c[0][y] == x) ^ (c[0][z] == y)) rotate(x);
else rotate(y);
}
rotate(x);
}
}
inline void access(int x)
{
int t = 0;
while(x) splay(x) , c[1][x] = t , t = x , x = findv(fa[x]);
}
inline void makeroot(int x)
{
access(x) , splay(x);
swap(c[0][x] , c[1][x]) , rev[x] ^= 1;
}
void dfs(int x)
{
if(!x) return;
if(fa[x]) fv[x] = findv(fa[x]);
dfs(c[0][x]) , dfs(c[1][x]);
}
inline void link(int x , int y)
{
x = findv(x) , y = findv(y);
if(findc(x) != findc(y)) makeroot(x) , fa[x] = y , fc[fc[x]] = fc[y];
else if(x != y) makeroot(x) , access(y) , splay(y) , dfs(y);
}
int main()
{
int n , m , q , i;
scanf("%d%d%d" , &n , &m , &q);
for(i = 1 ; i <= n ; i ++ ) fc[i] = fv[i] = i;
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &px[i] , &py[i]);
for(i = 1 ; i <= q ; i ++ )
{
scanf("%s%d%d" , str , &qx[i] , &qy[i]);
if(str[0] == 'Z') opt[i] = 1 , s.insert(make_pair(min(qx[i] , qy[i]) , max(qx[i] , qy[i])));
}
for(i = 1 ; i <= m ; i ++ )
if(s.find(make_pair(min(px[i] , py[i]) , max(px[i] , py[i]))) == s.end())
link(px[i] , py[i]);
for(i = q ; i ; i -- )
{
if(opt[i]) link(qx[i] , qy[i]);
else ans[i] = (findv(qx[i]) == findv(qy[i]));
}
for(i = 1 ; i <= q ; i ++ )
if(!opt[i])
puts(ans[i] ? "Yes" : "No");
return 0;
}
【bzoj4229】选择 离线+LCT的更多相关文章
- 01 选择 Help > Install New Software,在出现的对话框里,点击Add按钮,在对话框的name一栏输入“ADT”,点击Archive...选择离线的ADT文件,contact all update ....千万不要勾选点击Add按钮,在对话框的name一栏输入“ADT”,点击Archive...选择离线的ADT文件,contact all update ....千万不要勾
引言 好久没碰过android,今天重新搭建了一次环境,遇到的问题记录下载.共以后使用. 安装 软件的软件有jdk+eclipse+adt+sdk 主要记录安装adt和sdk的过程,注意,adt和sd ...
- BZOJ4229选择——LCT+并查集+离线(LCT动态维护边双连通分量)
题目描述 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路径可以从点u出 ...
- [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...
- bzoj4229: 选择
Description 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路 ...
- 在离线环境中使用.NET Core
在离线环境中使用.NET Core 0x00 写在开始 很早开始就对.NET Core比较关注,一改微软之前给人的印象,变得轻量.开源.跨平台.最近打算试着在工作中使用.但工作是在与互联网完全隔离的网 ...
- 离线安装Cloudera Manager 5和CDH5(最新版5.1.3) 完全教程
关于CDH和Cloudera Manager CDH (Cloudera's Distribution, including Apache Hadoop),是Hadoop众多分支中的一种,由Cloud ...
- CentOS 6.4 离线安装 Cloudera 5.7.1 CDH 5.7.1
因为项目开发需要要在本地组建一个Hadoop/Spark集群,除了Hadoop/Spark还要同时安装多个相关的组件,如果一个个组件安装配置,对于一个由多台服务器组成的集群来说,工作量是巨大的. 所以 ...
- Android SDK离线安装方法详解(加速安装) 转
AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助! 离线安装包下载地址:http://dl.vmall.com/c ...
- android离线下载的相关知识
离线下载的功能点如下: 1.下载管理(开始.取消下载). 2.网络判断(Wi-Fi,3G). 3.独立进程. 4.定时和手机催醒. 5.自启动. 选择 ...
随机推荐
- nodejs module/require
1. wrap up a module using module.exports, name the file to a.js var fun1=function(){ var stylus = re ...
- Prism for WPF 搭建一个简单的模块化开发框架(一)
原文:Prism for WPF 搭建一个简单的模块化开发框架(一) 最近闲来无事又想搞搞WPF..... 做个框架吧,可能又是半途而废....总是坚持不下来 不废话了, 先看一下工程结构 布局大概是 ...
- 用label实现横向瀑布流的方法
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXcAAAKxCAIAAAAn+3udAAAKqWlDQ1BJQ0MgUHJvZmlsZQAASImVlg
- Java子类与父类之间的类型转换
1.向上转换 父类的引用变量指向子类变量时,子类对象向父类对象向上转换.从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制. 2.向下转换 在父类变 ...
- 「日常训练」Kefa and Park(Codeforces Round #321 Div. 2 C)
题意与分析(CodeForces 580C) 给你一棵树,然后每个叶子节点会有一家餐馆:你讨厌猫(waht?怎么会有人讨厌猫),就不会走有连续超过m个节点有猫的路.然后问你最多去几家饭店. 这题我写的 ...
- Qt-QML-给我的导航条写一个动画-State-Transition
上篇中,我已经写出一个导航条的,虽然太丑了,不过功能是有了,这次我将要给我的导航条加一个动画,先看下演示效果 这次我是用的是一个状态动画,大致原理就是写出一个空间的几个状态,完了再加一个过度动画,这里 ...
- 180706-BigDecimal除法的精度问题
BigDecimal除法的精度问题 在使用BigDecimal的除法时,遇到一个鬼畜的问题,本以为的精度计算,结果使用返回0,当然最终发现还是自己的使用姿势不对导致的,因此记录一下,避免后面重蹈覆辙 ...
- Linux命令应用大词典-第6章 文件处理
6.1 sort:对文件中的数据进行排序 6.2 uniq:将重复行从输出文件中删除 6.3 cut:从文件每行中输出选定的字节.字符或字段 6.4 comm:逐行比较两个已经排序的文件 6.5 di ...
- 如何编写 Python 程序
如何编写 Python 程序 从今以后,保存和运行 Python 程序的标准步骤如下: 对于 PyCharm 用户 打开 PyCharm. 以给定的文件名创建新文件. 输入案例中给出的代码. 右键并运 ...
- python常用命令—查看模块所在位置
环境:ipython3 交互式解释器 语法: import 模块名 模块名.__file__ 功能: 查看模块的所在位置 例: