套路地,

考虑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. VMware vCenter Converter迁移Linux系统虚拟机

    (一)简介VMware vCenter Converter Standalone,是一种用于将虚拟机和物理机转换为 VMware 虚拟机的可扩展解决方案.此外,还可以在 vCenter Server ...

  2. MyBatis学习(一)————纯jdbc编程

    什么是JDBC  JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...

  3. Vs2012 编写代码规则

    FxCop编写规则 VS2012 下更方便,所需的DLL在: D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Static ...

  4. Vue 入门之概念

    Vue 简介 Vue 是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 [view].新的 Vue 版本参考了 React 的部分设计,当然也有自己独特的地方,比如 Vue 的单文件组 ...

  5. JS中判断对象是不是数组的方法

    JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...

  6. “Hello World!”团队第七周召开的第五次会议

    今天是我们团队“Hello World!”团队第七周召开的第五次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码 一 ...

  7. Scrum Meeting 12 -2014.11.18

    今天的任务都比较顺利,测试暂时还没发现特别的问题. Member Today’s task Next task 林豪森 与其他小组商讨整合问题 与其他小组商讨整合问题 宋天舒 测试项目功能实现 测试项 ...

  8. Java第二次实验20135204

    一.实验过程: 1.先创建一个学号命名的文档: 2.一个百分制成绩转化为等级: 3.新建一个包,另一个测试: 4.打开UML,建模软件umbrello进行建模: 相关程序: 5.我的保存: 二.遇到的 ...

  9. 20162314 《Program Design & Data Structures》Learning Summary Of The Fifth Week

    20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Fifth Week ...

  10. 1001. A+B Format (20)的解题思路以及多源代码文件的尝试编写

    前言 这几天刚学了多源代码文件的编译,因为想尝试使用一下这种方法,所以想用此编写这次作业的程序.正好可以learning by doing,在做当中学习新知识.(编译器为Dev-C++) github ...