套路地,

考虑dfs树上搞事情

容易发现,对于(x,y)如果dfs树上距离为奇数,或者dfs树上路径中有一条边在某个简单奇环上,那么可以经过奇数条边到达

判断边在某个奇环上:

点双,点双中黑白染色,如果有一个奇环,那么点双中的所有边都在一个奇环中

询问

倍增预处理,LCA搞一下即可

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
int n,m;
struct node{
int nxt,to;
int id;
}e[*N];
int a[N][];
int hd[N],cnt=;
int ok[N],dep[N];
int fa[N][],has[N][];
int blo[N],bls;
void add(int x,int y,int d){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
e[cnt].id=d;
hd[x]=cnt;
}
int dfn[N],low[N];
int df;
int be[N];
int dcc;
vector<int>mem[N];
int exi[N];//dcc exi a jihuan int sta[N],top;
int ge[N];
int rt;
void tarjan(int x){
// cout<<" tarjan "<<x<<endl;
dfn[x]=low[x]=++df;
sta[++top]=x;
blo[x]=bls;
bool fl=false;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
if(fl||x!=rt) ge[x]=;
fl=true;
++dcc;
mem[dcc].push_back(x);
int z;
do{
z=sta[top--];
mem[dcc].push_back(z);
}while(z!=y);
}
}else low[x]=min(low[x],dfn[y]);
}
}
int co[N];//white(2) or black(1) or blank(0)
int bian[*N],num;
bool fl;
void dfs1(int x,int c,int col){
co[x]=col;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(be[y]!=be[x]) continue;
bian[++num]=e[i].id;
if(!co[y]){
dfs1(y,c,col^);
}else{
if(co[y]==co[x]){
fl=false;
}
}
}
}
bool vis[N];
void dfs2(int x,int d){
dep[x]=d;
vis[x]=;
// cout<<" dfs2 "<<x<<" "<<d<<endl;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(vis[y]) continue;
fa[y][]=x;
has[y][]=ok[e[i].id];
dfs2(y,d+);
}
}
bool wrk(int x,int y){
int lp=;
int tmp=dep[x]+dep[y];
if(dep[x]<dep[y]) swap(x,y);
for(reg j=;j>=;--j){
if(dep[fa[x][j]]>=dep[y]){
lp|=has[x][j];
x=fa[x][j];
}
}
if(x==y) {
if((tmp-*dep[x])%==) return true;
if(lp) return true;
return false;
}
for(reg j=;j>=;--j){
if(fa[x][j]!=fa[y][j]){
lp|=has[x][j];
lp|=has[y][j];
x=fa[x][j];y=fa[y][j];
}
}
lp|=has[x][]|has[y][];
x=fa[x][]; if((tmp-*dep[x])%==) return true;
if(lp) return true;
return false;
}
int main(){
rd(n);rd(m);
int x,y;
for(reg i=;i<=m;++i){
rd(x);rd(y);
a[i][]=x;a[i][]=y;
add(x,y,i);add(y,x,i);
}
for(reg i=;i<=n;++i){
if(!dfn[i]){
top=;
++bls;
rt=i;
tarjan(i);
}
}
//cout<<" dcc "<<dcc<<endl;
for(reg i=;i<=dcc;++i){
// cout<<" nunumumuun "<<i<<endl;
for(reg j=;j<(int)mem[i].size();++j){
// cout<<mem[i][j]<<endl;
be[mem[i][j]]=i;
co[mem[i][j]]=;
}
num=;
fl=true;
dfs1(mem[i][],i,);
if(!fl){
for(reg j=;j<=num;++j){
// cout<<" bian[i] "<<bian[j]<<endl;
ok[bian[j]]=;
}
}
}
memset(dfn,,sizeof dfn);
for(reg i=;i<=n;++i){
if(!vis[i]){
dfs2(i,);
}
}
for(reg j=;j<=;++j){
for(reg i=;i<=n;++i){
fa[i][j]=fa[fa[i][j-]][j-];
has[i][j]=has[i][j-]|has[fa[i][j-]][j-];
}
}
int q;
rd(q);
while(q--){
rd(x);rd(y);
if(blo[x]!=blo[y]){
puts("No");
}
else puts(wrk(x,y)?"Yes":"No");
}
return ;
} }
signed main(){
// freopen("data3412.in","r",stdin);
// freopen("data3412.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/2 13:27:37
*/

fzyzojP3412 -- [校内训练20171212]奇数的更多相关文章

  1. [校内训练20_01_19]ABC

    1.SB题 2.有n个点,m条边,每次加入一条边,你要挑出一些边,使得形成的图每个点度数都为奇数,且最长的边最短. 3.给一个N次多项式,问有多少个质数在任意整数处的点值都是p的倍数,输出它们.$N ...

  2. 19_07_8校内训练[sort]

    题意 一个排列,每次选一个子序列按顺序放在开头,要求变成升序的操作次数不超过17次,给出方案.n<=1E5. 思考 对于ai=aj-1且i<j的数字,一定要保持其相对顺序.可以根据这个关系 ...

  3. [4.14校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi....        很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...

  4. [2017.4.7校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...

  5. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  6. 19_04_19校内训练[Game]

    题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...

  7. 19_04_02校内训练[deadline]

    题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...

  8. 平面图转对偶图&19_03_21校内训练 [Everfeel]

    对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...

  9. fzyzojP3979 -- [校内训练20180914]魔法方阵

    原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...

随机推荐

  1. QRCode 二维码

    一.生成二维码 1.二维码就是绘制成黑白相间的图片,所谓的黑白相间就是代表0和1 ,二维码大约可以容纳500多个中文,所以用途之广显而易见. 所需的jar包  http://pan.baidu.com ...

  2. mtr的用法场景

    ---引用自阿里云 mtr (My traceroute)也是几乎所有 Linux 发行版本预装的网络测试工具.他把 ping和 traceroute 的功能并入了同一个工具中,所以功能更强大. mt ...

  3. 高可用OpenStack(Queen版)集群-2.基础服务

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  4. Sony深度学习框架 - Neural Network Console - 教程(1)- 原来深度学习可以如此简单

    “什么情况!?居然不是黑色背景+白色文字的命令行.对,今天要介绍的是一个拥有白嫩的用户界面的深度学习框架.” 人工智能.神经网络.深度学习,这些概念近年已经涌入每个人的生活中,我想很多人早就按捺不住想 ...

  5. TeamWork#3,Week5,Introduction to the "take-away" Sale Selection Project

    一.NABCD 1.N(Need 需求) 当今社会生活节奏快,很多大学生.上班族叫外卖比较普遍,外卖生意异常火爆.最近美团.饿了么等外卖服务竞争激烈,产生了大量外卖优惠信息.而网络上外卖信息比较混乱, ...

  6. 2018-2019-20172329 《Java软件结构与数据结构》第七周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十一章-二叉查找树 一.概述 1.什么是二 ...

  7. Sqlite数据库初步的了解

    转载与:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0714/1438.html    来自:泡在网上的日子. 和其他数据库一 ...

  8. 私人助手(Alpha)版使用说明

    私人助手使用说明 私人助手这款软件是通过添加事件提醒,提醒你在合适的时间做该做的事,可以选择有多种提醒模式. 目前实现了对事件的添加和提醒功能,软件现在的情况如下: 1.添加事件 2.删除事件 3.事 ...

  9. 福大软工1816 · 评分结果 · Alpha冲刺答辩总结

    作业地址:https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2462 作业提交准则 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒 ...

  10. 【CSAPP笔记】13. 链接

    下面就要进入本书的第二部分--在系统上运行程序.书的第一部分,主要是研究单个应用程序,关注的是数据类型.机器指令.程序性能.存储器系统等话题.在书的第二部分,我们继续对计算机系统的探索.现代操作系统与 ...