萌新求助 *2200
查看原帖
萌新求助 *2200
154101
MatrixCascade楼主2021/3/6 10:02

RT,不知道为什么 WA on 4 了 /yun

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define clr(f, n) memset(f, 0, sizeof(int) * (n))
#define cpy(f, g, n) memcpy(f, g, sizeof(int) * (n))
#define rev(f, n) reverse(f, f + n)
#define pir pair<int, int>
#define mkp make_pair
#define fst it->first
#define sec it->second
#define int long long
#define up(i,x,y) for(int i=x,i##end=y;i<=i##end;++i)
#define down(i,x,y) for(int i=x,i##end=y;i>=i##end;--i)
using namespace std;
int n, m, k;
int read()
{
    int s = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s * f;
}
inline void print(int *f, int len)
{
    for (int i = 0; i < len; i++)
        printf("%lld ", f[i]);
    puts("");
}
const int maxn=2e5+10;
int head[maxn],to[maxn],nxt[maxn],tot;
int dep[maxn],anc[maxn][17];
void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
int fa[maxn],w[maxn],a[maxn];
int find(int x)
{
	return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
void dfs1(int x)
{
	dep[x]=dep[anc[x][0]]+1;
	for(int i=head[x];i;i=nxt[i])
	{
		int v=to[i];
		if(!dep[v])
		{
			anc[v][0]=x;
			dfs1(v);
			if(find(x)==find(v))a[x]|=a[v];
		}
		else if(dep[v]<dep[x]-1)
		{
			if((dep[x]+dep[v]+1)&1)w[x]=1;
			for(int xx=find(x);dep[xx]>dep[v]+1;xx=find(xx))fa[xx]=anc[xx][0];
		}
	}
}
void dfs2(int x)
{
	a[x]+=w[x];
	for(int i=head[x];i;i=nxt[i])
	{
		int v=to[i];
		if(dep[v]==dep[x]+1)
		{
			if(find(x)==find(v))w[v]|=w[x];
			a[v]=a[x];
			dfs2(v);
		}
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	down(i,16,0)if(dep[anc[x][i]]>=dep[y])x=anc[x][i];
	if(x==y)return x;
	down(i,16,0)if(anc[x][i]!=anc[y][i])x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
signed main()
{
	n=read(),m=read();
	up(i,1,m)
	{
		int x=read(),y=read();
		add(x,y);add(y,x);
	}
	up(i,1,n)fa[i]=i;
	up(i,1,n)
	{
		if(!dep[i])dfs1(i),dfs2(i);
	}
	up(j,1,16)up(i,1,n)anc[i][j]=anc[anc[i][j-1]][j-1];
	int Q=read();
	while(Q--)
	{
		int u=read(),v=read();
		int qwq=lca(u,v);
		if(!qwq) puts("No");
		else if(((dep[u]+dep[v])&1)||a[u]+a[v]-2*a[qwq]) puts("Yes");
		else puts("No");
	}
}
/*
7 7
1 3
1 4
2 3
2 4
7 5
5 6
6 7
8
1 2
1 3
1 4
2 4
1 5
5 6
5 7
6 7
*/
2021/3/6 10:02
加载中...