\(\text{Problem}\)

给定一张无向图,\(q\) 次询问,删去一个点或一条相邻两点间的边,问两点是否连通

询问独立

\(\text{Solution}\)

明显的用圆方树把图变成树

然后问一棵树中删去一个点或一条边两点连不连通

只要讨论点双上的点与边,\(LCA\) 与割去点的位置关系即可

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#include <cstring>
#define RE register
#define IN inline
using namespace std; const int N = 2e5 + 5;
int n, m, q, cnt, tot1, tot2, top, dfc;
int h1[N], h2[N], dfn[N], low[N], fa[N][21], dep[N], siz[N], stk[N];
struct edge{int nxt, to;}e1[N * 5], e2[N * 5];
IN void add1(int x, int y){e1[++tot1] = edge{h1[x], y}, h1[x] = tot1;}
IN void add2(int x, int y){e2[++tot2] = edge{h2[x], y}, h2[x] = tot2;} void Tarjan(int x)
{
stk[++top] = x, low[x] = dfn[x] = ++dfc;
for(RE int i = h1[x]; i; i = e1[i].nxt)
{
int v = e1[i].to;
if (!dfn[v])
{
Tarjan(v), low[x] = min(low[x], low[v]);
if (dfn[x] == low[v])
{
++cnt, add2(cnt, x), add2(x, cnt);
for(RE int u = 0; u != v; --top) u = stk[top], add2(cnt, u), add2(u, cnt);
}
}
else low[x] = min(low[x] , dfn[v]);
}
} void Dfs(int x)
{
dfn[x] = ++dfc, siz[x] = 1;
for(RE int i = 1; i <= 18; i++)
if (fa[x][i - 1]) fa[x][i] = fa[fa[x][i - 1]][i - 1];
else break;
for(RE int i = h2[x]; i; i = e2[i].nxt)
{
int v = e2[i].to;
if (v == fa[x][0]) continue;
dep[v] = dep[x] + 1, fa[v][0] = x, Dfs(v), siz[x] += siz[v];
}
} IN int LCA(int x, int y)
{
int u = x, v = y;
if (dep[u] < dep[v]) swap(u , v);
int deep = dep[u] - dep[v];
for(RE int i = 0; i <= 18; i++) if (deep & (1 << i)) u = fa[u][i];
if (u == v) return u;
for(RE int i = 18; i >= 0; i--)
if (fa[u][i] ^ fa[v][i]) u = fa[u][i], v = fa[v][i];
return fa[u][0];
} int main()
{
scanf("%d%d", &n, &m);
for(RE int i = 1, x, y; i <= m; i++) scanf("%d%d", &x, &y), add1(x, y), add1(y, x);
cnt = n, Tarjan(1), dfc = 0, Dfs(1), scanf("%d", &q);
for(RE int op, x, y, u, v, flag, lca; q; q--)
{
scanf("%d%d%d%d", &op, &x, &y, &u), flag = 0;
if (op == 1)
{
scanf("%d", &v), lca = LCA(u, v);
if (dep[u] < dep[v]) swap(u, v);
if (lca != u && lca != v) flag = 1;
else if (siz[fa[u][0]] > siz[u] + 1) flag = 1;
else{
lca = LCA(x, y);
if (dfn[lca] >= dfn[u] && dfn[lca] <= dfn[u] + siz[u] - 1) flag = 1;
else if (!(dfn[x] >= dfn[u] && dfn[x] <= dfn[u] + siz[u] - 1) && !(dfn[y] >= dfn[u] && dfn[y] <= dfn[u] + siz[u] - 1))
flag = 1;
}
}
else{
lca = LCA(x, y);
if (lca == u);
else if (dfn[lca] > dfn[u] && dfn[lca] <= dfn[u] + siz[u] - 1) flag = 1;
else if (!(dfn[x] >= dfn[u] && dfn[x] <= dfn[u] + siz[u] - 1) && !(dfn[y] >= dfn[u] && dfn[y] <= dfn[u] + siz[u] - 1))
flag = 1;
}
if (flag) printf("yes\n"); else printf("no\n");
}
}

JZOJ 2114. 【GDKOI2011】反恐任务的更多相关文章

  1. HDU1243:反恐训练营

    题目链接:反恐训练营 题意:本质上是求最大公共子序列,然后加上一个权值 分析:见代码 //公共子序列问题 //dp[i][j]表示前s1的前i个与s的前j个匹配得到的最大公共子序列 #include& ...

  2. 反恐训练营(LCS)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. 反恐24小时第一季/全集24 Live Another Day迅雷下载

    反恐24小时 第一至九季 24 Season 1-9 (2001-2014) 本季看点:<24小时>第8季将在拥有美国的象征自由女神像的纽约开始,在新的一天,CTU重新开张,新的领导为从M ...

  4. HDU 1243 反恐训练营(最长公共序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  5. HDU - 1243 - 反恐训练营

    先上题目: 反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. HDU 1243 反恐训练营 (动态规划求最长公共子序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. hdu 1243 反恐训练营 最长公共字序列

    此题的题意很明确,就是求最长公共子序列: #include<iostream> #include<algorithm> #include<cstdio> #incl ...

  8. hdu 1243 反恐训练营(dp 最大公共子序列变形)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1243 d[i][j] 代表第i 个字符与第 j 个字符的最大的得分.,, 最大公共子序列变形 #inclu ...

  9. 【HDOJ】1243 反恐训练营

    LCS. /* 1243 */ #include <cstdio> #include <cstring> #include <cstdlib> #define MA ...

  10. 基础3.Jquery操作Dom

                  1 内部插入节点 <body> <ul id="city"> <li id="bj" name=&qu ...

随机推荐

  1. Linux deb系统 nginx 配置解析php

    如果你是root用户可以不加sudo 首先安装php php-fpm nginx sudo apt-get install php php-fpm nginx -y nginx 是一个轻量级的http ...

  2. 关于python路径的问题思考

    我相信你肯定遇到过这样的报错 Traceback (most recent call last): File "main.py", line 549, in <module& ...

  3. Go1.20 新版覆盖率方案解读

    玩过Go覆盖率的同学当有所了解,Go的覆盖率方案最初的设计目标仅是针对单测场景,导致其局限性很大.而为了适配更多的场景,行业内各种博客.插件.黑科技介绍也层出不穷.当然,过去我们也开源过Go系统测试覆 ...

  4. Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理

    上期我们详细介绍了Zabbix与乐维监控的架构与性能对比分析,透过架构与性能对比分析,用户可以对乐维监控之所以能成为"Zabbix企业版"有一个初步的认知.本篇是Zabbix对比乐 ...

  5. 【SQL真题】SQL2:平均播放进度大于60%的视频类别

    题目:https://www.nowcoder.com/practice/c60242566ad94bc29959de0cdc6d95ef?tpId=268&tqId=2285039& ...

  6. python3中的常见知识点3------reduce()函数

    python3中的常见知识点3--reduce()函数 python3导入reduce()函数 reduce()函数语法 reduce()举例 其他python3常用函数 参考链接 python3中不 ...

  7. MySQL的select for update用法

    MySQL中的select for update大家应该都有所接触,但什么时候该去使用,以及有哪些需要注意的地方会有很多不清楚的地方,我把我如何使用和查询到的文档在此记录. 作用 select本身是一 ...

  8. SQLMap入门——获取当前网站数据库的名称

    列出当前网站使用的数据库 python sqlmap.py -u http://localhost/sqli-labs-master/Less-1/?id=1 --current-db

  9. RSA中用到的推导,笔记持续更新

    1.同余式组求p和q 已知条件: 推导过程: 根据上述已知条件,以及同余式性质,我们可以得到如下: c1e2 = (2p + 3q)e1*e2 mod N c2e1 = (5p + 7q)e1*e2  ...

  10. WireShark抓包入门教学

    wireshark抓包新手使用教程 Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wiresha ...