CF639F Bear and Chemistry

题目传送门

分析:
题目描述的条件实际上是在要求所有点在同一个边双连通分量中
先在原图跑tarjan,缩点建树,
询问的点和加入的边的点处理之后变成边双上的点
然后建虚树,在虚树上跑tarjan就好了
不难,写起来真恶心

#include
#include
#include
#include
#include
#include

#define maxn 600005
#define MOD 1000000007
#define INF 0x3f3f3f3f

using namespace std;

inline long long getint()
{
    long long num=0,flag=1;char c;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
    while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
    return num*flag;
}

int n,m,q,R;
int fir[maxn],nxt[maxn],to[maxn],cnt;
int sz[maxn],tp[maxn],fa[maxn],son[maxn],dpt[maxn],pos[maxn],cur;
map,int>M;
int p[maxn],V[maxn];
int P_stk[maxn],P_Tp;

inline int rotate(int x){x=(x+R)%n;return x?x:x+n;}
inline bool cmp(int x,int y)
{return pos[x]sz[son[u]])son[u]=to[i];
	}
}
inline void dfs2(int u,int ac)
{
	tp[u]=ac;if(son[u])dfs2(son[u],ac);
	for(int i=fir[u];i;i=nxt[i])if(to[i]!=fa[u]&&to[i]!=son[u])dfs2(to[i],to[i]);
}
inline int LCA(int u,int v)
{
	for(;tp[u]!=tp[v]&&u&&v;u=fa[tp[u]])if(dpt[tp[u]]G[maxn],Id[maxn];
	int dfn[maxn],low[maxn],tim,vis[maxn],sccno[maxn],scccnt;
	int stk[maxn],Tp;
	
	inline void tarjan(int u)
	{
		dfn[u]=low[u]=++tim;stk[++Tp]=u;
		for(int i=0,v;i

你可能感兴趣的:(CF639F Bear and Chemistry)