1. 程式人生 > >CF 97 E

CF 97 E

題目大意: 給你一張圖多次詢問兩點路徑是否為奇數。 題解: 一看就是個圓方樹 想了想細節挺多就棄療了 然後想了一個假做法,即隨便弄出一個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; }