题目


分析

先建一棵圆方树,必经点\(z\)就是满足\(z\)在\(x\)和\(y\)之间的路径上,

这个直接用树链剖分做,必经边必须要满足不在环上,

那么这个必经边就可以找到一个方点,就可以转换成必经点的问题


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#include <map>
#define rr register
using namespace std;
const int N=200011; struct node{int y,next;}e[N*5],E[N*5]; map<pair<int,int>,int>uk;
int dfn[N],low[N],stac[N],hs[N],dep[N],nfd[N],fat[N],big[N],et=1,Et=1;
int as[N],siz[N],Top[N],cnt[N],dis[N],tot,TOP,n,ext,m,las,a[N],Q;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void add(int x,int y){
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
inline signed min(int a,int b){return a<b?a:b;}
inline void tarjan(int x,int F){
dfn[x]=low[x]=++tot,stac[++TOP]=x;
for (rr int i=hs[x];i;i=E[i].next)
if (!dfn[E[i].y]){
tarjan(E[i].y,i^1);
low[x]=min(low[x],low[E[i].y]);
if (dfn[x]<=low[E[i].y]){
cnt[++ext]=2;
if (dfn[x]<low[E[i].y]){
rr int X=x,Y=E[i].y;
if (X>Y) X^=Y,Y^=X,X^=Y;
uk[make_pair(X,Y)]=ext;
}
for (;stac[TOP]!=E[i].y;--TOP)
add(ext,stac[TOP]),++cnt[ext];
add(ext,stac[TOP--]),add(ext,x);
}
}else if (i!=F) low[x]=min(low[x],dfn[E[i].y]);
}
inline void dfs1(int x,int fa){
dep[x]=dep[fa]+1,fat[x]=fa,
dis[x]=dis[fa]+(x<=n),siz[x]=1;
for (rr int i=as[x],SIZ=-1;i;i=e[i].next)
if (e[i].y!=fa){
dfs1(e[i].y,x),siz[x]+=siz[e[i].y];
if (siz[e[i].y]>SIZ) big[x]=e[i].y,SIZ=siz[e[i].y];
}
}
inline void dfs2(int x,int linp){
dfn[x]=++tot,nfd[tot]=x,Top[x]=linp;
if (!big[x]) return; dfs2(big[x],linp);
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fat[x]&&e[i].y!=big[x])
dfs2(e[i].y,e[i].y);
}
inline bool pass_by(int x,int y,int z){
for (;Top[x]!=Top[y];x=fat[Top[x]]){
if (dep[Top[x]]<dep[Top[y]]) x^=y,y^=x,x^=y;
if (Top[z]==Top[x]&&dep[z]<=dep[x]) return 1;
}
if (dep[x]>dep[y]) x^=y,y^=x,x^=y;
if (Top[y]==Top[z]&&dep[x]<=dep[z]&&dep[z]<=dep[y]) return 1;
return 0;
}
signed main(){
ext=n=iut(),m=iut();
for (rr int i=1;i<=m;++i){
rr int x=iut(),y=iut();
E[++Et]=(node){y,hs[x]},hs[x]=Et,
E[++Et]=(node){x,hs[y]},hs[y]=Et;
}
tarjan(1,0),tot=TOP=0,dfs1(1,0),dfs2(1,1);
for (rr int Q=iut();Q;--Q){
rr int opt=iut(),x=iut(),y=iut(),z;
if (opt==1){
rr int X=iut(),Y=iut();
if (X>Y) X^=Y,Y^=X,X^=Y;
z=uk[make_pair(X,Y)];
if (!z) {puts("yes"); continue;}
}else z=iut();
puts(pass_by(x,y,z)?"no":"yes");
}
return 0;
}

#圆方树,树链剖分#P4334 [COI2007] Policija的更多相关文章

  1. P4334 [COI2007] Policija

    P4334 [COI2007] Policija 题意 一个无重边的无向图,每次询问删掉一条边或删掉一个点后两个点是否联通. 思路 连通性问题,我们可以考虑使用广义圆方树解决. 对于删掉一个点的情况: ...

  2. 线段树&数链剖分

    傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...

  3. UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...

  4. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

  5. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  6. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  7. 2019.01.08 codeforces 1009F. Dominant Indices(长链剖分)

    传送门 长链剖分模板题. 题意:给出一棵树,设fi,jf_{i,j}fi,j​表示iii的子树中距离点iii距离为jjj的点的个数,现在对于每个点iii要求出使得fif_ifi​取得最大值的那个jjj ...

  8. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  9. BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)

    题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...

  10. CF487E Tourists(圆方树+树链剖分+multiset/可删堆)

    CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解 ...

随机推荐

  1. Flutter学习(PV)——概览

    接触flutter有一段时间了,趁着刚过完年有点时间,记录一些有用的东西,一方面给自己备忘,另一方面也希望能帮到有需要的人~ 一.什么是flutter Flutter is Google's UI t ...

  2. 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测cpu温度的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行(需要管理员权限):     国产麒麟操作上运 ...

  3. DataGear 使用静态HTML模板制作数据可视化看板

    DataGear 看板提供了导入静态 HTML 模板的功能,使您可以利用已有的任意 HTML 网页资源快速制作数据可视化看板. 首先,您需要准备一套已设置好布局的静态 HTML 模板,其中包含的 HT ...

  4. 【Azure App Service】通过Visual Studio部署Azure App Service 遇见 401 'Unauthorized'错误

    问题描述 最近通过Visual Studio 2022部署Azure App Service的时候,突然遇见了部署失败, 401 Unauthorized错误. 错误消息: Build started ...

  5. 【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常

    Azure Spring Cloud 是什么? 借助 Azure Spring Cloud,可以轻松地将 Spring Boot 微服务应用程序部署到 Azure,不需更改任何代码. 该服务管理 Sp ...

  6. MongoDB可视化compass 连接数据库失败Invalid UTF-8 string in BSON document

    An error occurred while loading navigation: Invalid UTF-8 string in BSON document 出现这个问题建议降低compass版 ...

  7. Abp.Zero 手机号免密登录验证与号码绑定功能的实现(二):改造Abp默认实现

    接下来我们重写原Abp的部分实现,来驳接手机号相关业务. 改造User类 重写PhoneNumber使得电话号码为必填项,和中国大陆手机号11位长度 public new const int MaxP ...

  8. es索引数据复制并增加条件和修改目标数据值

    es操作同一个索引里数据的复制语法 复制数据: POST _reindex { "source": { "index": "source_index& ...

  9. SAE自动驾驶分级介绍

    SAE International 国际自动机工程师学会(原译:美国汽车工程师学会)英文全程为:Society of Automotive Engineers International,是一个全球性 ...

  10. 【预训练语言模型】BERT原理解析、常见问题和微调实战

    一.BERT原理 1.概述        背景:通过在大规模语料上预训练语言模型,可以显著提高其在NLP下游任务的表现.        动机:限制模型潜力的主要原因在于现有模型使用的都是单向的语言模型 ...