CF 97 E
阿新 • • 發佈:2018-12-19
題目大意: 給你一張圖多次詢問兩點路徑是否為奇數。 題解: 一看就是個圓方樹 想了想細節挺多就棄療了 然後想了一個假做法,即隨便弄出一個dfs樹然後詢問路徑如果和非樹邊產生的奇環相交就是yes。這樣場上並沒有過大樣例但是隻有一個誤差(共1e5組詢問)。後來閒的沒事把邊表和dfs序列random_shuffle了一遍,然後……咦我怎麼80分了?然後改成跑十遍這個隨機然後就過了…… 順帶在cf上也能過。 upd:後來被發現是可以被卡的,加了個奇怪的東西仍然過了。但是隻保留一開始的程式碼:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define N 100010
#define M 100010
#define LOG 20
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
int x,ch;while((ch=gc)<'0'||ch>'9');
x=ch^'0';while((ch=gc)>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^'0');return x;
}
int d[N],up[N][LOG], Log[N],vis[N],bel[N],id[N],ql[N];
int qx[N],qy[N],isno[N];lint val[N];vector<int> g[N],to[N];
lint dfs(int x,int fa,int cnt)
{
memset(up[x],0,sizeof up[x]);
d[x]=d[fa]+1,vis[x]=1,bel[x]=cnt,up[x][0]=fa;
for(int i=1;i<=Log[d[x]];i++) up[x][i]=up[up[x][i-1]][i-1];
for(int i=0,y;i<(int)to[x].size();i++) if((y=to[x][i])^fa)
{
if(!vis[y]) val[x]+=dfs(y,x,cnt),g[x].pb(y);
else if(vis[y]==1&&(d[x]&1)==(d[y]&1)) val[x]++,val[y]--;
}
return vis[x]=2,val[x];
}
int getval(int x,int fa=0) { val[x]+=val[fa];Rep(i,g[x]) getval(g[x][i],x);return 0; }
inline int getLCA(int x,int y)
{
if(d[x]<d[y]) swap(x,y);
for(int i=Log[d[x]];i>=0;i--)
if(d[up[x][i]]>=d[y]) x=up[x][i];
if(x==y) return x;
for(int i=Log[d[x]];i>=0;i--)
if(up[x][i]^up[y][i]) x=up[x][i],y=up[y][i];
return up[x][0];
}
char ss[1000000];int ssl;
int main()
{
srand((unsigned int)(time(0)-20010817-20010916));
int n=inn(),m=inn(),x,y;rep(i,2,n) Log[i]=Log[i>>1]+1;
rep(i,1,m) x=inn(),y=inn(),to[x].pb(y),to[y].pb(x);
int q=inn(),qcnt=q;rep(i,1,n) id[i]=i;
rep(i,1,q) qx[i]=inn(),qy[i]=inn(),ql[i]=i;
for(int Tms=25;qcnt&&Tms;Tms--)
{
rep(x,1,n) g[x].clear(),val[x]=0;int cnt=0;
rep(x,1,n) random_shuffle(to[x].begin(),to[x].end());
memset(vis,0,sizeof(int)*(n+1)),random_shuffle(id+1,id+n+1);
rep(i,1,n) if(!vis[id[i]]) d[id[i]]=0,dfs(id[i],0,++cnt),getval(id[i]);
rep(i,1,qcnt)
{
int x=qx[ql[i]],y=qy[ql[i]];
if(bel[x]^bel[y]) { isno[ql[i]]=1;continue; }
if((d[x]&1)!=(d[y]&1)) { isno[ql[i]]=0;continue; }
int c=getLCA(x,y);
if(val[x]+val[y]-2*val[c]) isno[ql[i]]=0;
else isno[ql[i]]=1;
}
int qc=0;
rep(i,1,qcnt) if(isno[ql[i]]) ql[++qc]=ql[i];
qcnt=qc;
}
rep(i,1,q)
if(isno[i]) ss[++ssl]='N',ss[++ssl]='o',ss[++ssl]='\n';
else ss[++ssl]='Y',ss[++ssl]='e',ss[++ssl]='s',ss[++ssl]='\n';
return fwrite(ss+1,sizeof(char),ssl,stdout),0;
}