删边操作不好处理,所以先将操作倒序,将删边转化为加边。

考虑对于两个点的询问,若这两点不连通或这两个点分别处于两个不同的边双连通分量中(两点间存在桥)时,是不满足题目要求的。

可以用\(LCT\)来维护原图的一个生成树,原先每条边带有边权,若在原图中或加边过程中出现了环,则在树上这两点之间的边全部边权清零。

此时如果对两点之间求路径权值和,若在原图中这两点处在一个环上,那么权值和肯定为\(0\),同时用并查集维护连通性,就可以对询问进行回答了。

具体实现看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 300010
#define mk make_pair
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,m,qu,tot;
int f[maxn],ans[maxn];
int fa[maxn],ch[maxn][2],rev[maxn],val[maxn],sum[maxn],tag[maxn];
char opt[maxn][2];
map<pair<int,int>,int> mp;
struct edge
{
int x,y;
}e[maxn],q[maxn];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
bool check(int x)
{
return ch[fa[x]][1]==x;
}
void pushup(int x)
{
sum[x]=val[x]+sum[ch[x][0]]+sum[ch[x][1]];
}
void pushrev(int x)
{
rev[x]^=1,swap(ch[x][0],ch[x][1]);
}
void pushtag(int x)
{
tag[x]=1,sum[x]=val[x]=0;
}
void pushdown(int x)
{
int ls=ch[x][0],rs=ch[x][1];
if(rev[x]) pushrev(ls),pushrev(rs),rev[x]=0;
if(tag[x]) pushtag(ls),pushtag(rs),tag[x]=0;
}
bool notroot(int x)
{
return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
}
void rotate(int x)
{
int y=fa[x],z=fa[y],k=check(x),w=ch[x][k^1];
if(notroot(y)) ch[z][check(y)]=x;
ch[x][k^1]=y,ch[y][k]=w;
if(w) fa[w]=y;
fa[x]=z,fa[y]=x;
pushup(y),pushup(x);
}
void all(int x)
{
if(notroot(x)) all(fa[x]);
pushdown(x);
}
void splay(int x)
{
all(x);
for(int y;notroot(x);rotate(x))
if(notroot(y=fa[x]))
rotate(check(x)^check(y)?x:y);
pushup(x);
}
void access(int x)
{
for(int y=0;x;y=x,x=fa[x])
splay(x),ch[x][1]=y,pushup(x);
}
void makeroot(int x)
{
access(x),splay(x),pushrev(x);
}
void split(int x,int y)
{
makeroot(x),access(y),splay(y);
}
void link(int x,int y)
{
makeroot(x),fa[x]=y;
}
void Link(int x,int y)
{
f[find(x)]=find(y),val[++tot]=1;
link(x,tot),link(tot,y);
}
int query(int x,int y)
{
split(x,y);
return sum[y];
}
int main()
{
read(n),read(m),read(qu),tot=n;
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1;i<=m;++i)
{
read(e[i].x),read(e[i].y);
if(e[i].x>e[i].y) swap(e[i].x,e[i].y);
}
for(int i=1;i<=qu;++i)
{
scanf("%s",opt[i]),read(q[i].x),read(q[i].y);
if(q[i].x>q[i].y) swap(q[i].x,q[i].y);
if(opt[i][0]=='Z') mp[mk(q[i].x,q[i].y)]=1;
}
for(int i=1;i<=m;++i)
{
int x=e[i].x,y=e[i].y;
if(mp.count(mk(x,y))||find(x)==find(y)) continue;
mp[mk(x,y)]=1,Link(x,y);
}
for(int i=1;i<=m;++i)
{
int x=e[i].x,y=e[i].y;
if(mp.count(mk(x,y))) continue;
split(x,y),pushtag(y);
}
for(int i=qu;i;--i)
{
int x=q[i].x,y=q[i].y;
if(opt[i][0]=='Z')
{
if(find(x)==find(y)) split(x,y),pushtag(y);
else Link(x,y);
}
else
{
ans[i]=query(x,y);
if(find(x)!=find(y)) ans[i]=1;
}
}
for(int i=1;i<=qu;++i)
{
if(opt[i][0]=='P')
{
if(ans[i]) puts("NIE");
else puts("TAK");
}
}
return 0;
}

题解 洛谷 P6351 【[PA2011]Hard Choice】的更多相关文章

  1. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  2. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  3. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  4. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  5. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  6. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  7. 题解-洛谷P5217 贫穷

    洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...

  8. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

  9. 题解 洛谷P2158 【[SDOI2008]仪仗队】

    本文搬自本人洛谷博客 题目 本文进行了一定的更新 优化了 Markdown 中 Latex 语句的运用,加强了可读性 补充了"我们仍不曾知晓得 消失的 性质5 ",加强了推导的严谨 ...

随机推荐

  1. angular 接入 IdentityServer4

    angular 接入 IdentityServer4 Intro 最近把活动室预约的项目做了一个升级,预约活动室需要登录才能预约,并用 IdentityServer4 做了一个统一的登录注册中心,这样 ...

  2. 使用Apache Hudi构建大规模、事务性数据湖

    一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk 关于Nishith Agarwal更详细的介绍,主 ...

  3. node+ajax实战案例(5)

    6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...

  4. js语法基础入门(6)

    6.函数 6.1.函数是什么? 函数就是具有名称和一定功能点代码块,这段代码块被封装起来,由一组语句组成,它们是JavaScript的基础模块单元,用于代码复用.信息隐藏和组合调用.一般来说,所谓编程 ...

  5. Taro 3 正式版发布:开放式跨端跨框架解决方案

    作者:凹凸曼 - yuche 从 Taro 第一个版本发布到现在,Taro 已经接受了来自于开源社区两年多的考验.今天我们很高兴地在党的生日发布 Taro 3(Taro Next)正式版,希望 Tar ...

  6. JasperReport报表中输出Excel时,部分列不显示的问题

    JasperReport开源报表功能强大,是我们WEB系统中做报表开发的一个强有力的工具,上手也比较简单.我碰到的问题是进行报表输出时,在html网页中显示正常,但如果导出为Excel时,部分列不显示 ...

  7. Oracle查询表空间使用率很慢

    Oracle查询表空间使用率很慢 问题描述 执行查询表空间的语句,需要接近2min的时间才能执行完成. 以前也在其他客户的生产库遇到过一样的情况,当时是由于回收站的内容过多引起的. 不过这次的情况却不 ...

  8. java架构-一些设计上的基本常识

    最近给团队新人讲了一些设计上的常识,可能会对其它的新人也有些帮助, 把暂时想到的几条,先记在这里. 1.API与SPI分离 框架或组件通常有两类客户,一个是使用者,一个是扩展者. API(Applic ...

  9. Vs Code推荐安装插件

    前言: Visual Studio Code是一个轻量级但功能强大的源代码编辑器,轻量级指的是下载下来的Vs Code其实就是一个简单的编辑器,强大指的是支持多种语言的环境插件拓展,也正是因为这种支持 ...

  10. Face The Right Way思维。。。

    题目再次链接 题意: 已知01序列a,求进行定长子串取反的最少操作次数,以及最少时的定长. 分析: 首先,先想一想怎么暴力吧.这样想:要保证最小,那么必然不会对同一个区间反转两次,而在k一定时,则不会 ...