bzoj1998: [Hnoi2010]Fsk物品調度
阿新 • • 發佈:2017-05-19
for () 路徑壓縮 algo include ide span void std
鏈接......不知道為啥放不動啊。
第一次用手機寫bzoj的題,也是第一次用手機寫的題解,順便實現了一下手機上的對拍。
可以用鏈表+並查集維護一下什麽的。
環之間的邊是不是不太好路徑壓縮?
我是直接環內路徑壓縮,環外不管。
這樣應該是會被卡的(d==n???)
可是交上去還是過了。
#include<vector> #include<cstdio> #include<cstring> #include<algorithm> #define MN 110001 using namespace std; int read_ca,read_p; inlineView Codeint read(){ read_ca=getchar();read_p=0; while (read_ca<‘0‘||read_ca>‘9‘) read_ca=getchar(); while (read_ca>=‘0‘&&read_ca<=‘9‘) read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } vector <int> v[MN]; int T,m,q,p,n,s,d,c[MN],pos[MN],ne[MN],fi[MN],fa[MN],mmh,be[MN];bool bo[MN]; int gf(int x){if (x==fa[x]) return x;else {int y=gf(fa[x]);if (be[x]==be[y]) fa[x]=y;return y;}} inline void del(int x){ if (ne[x]==x){ for (int i=0;i<v[be[x]].size();i++) fa[v[be[x]][i]]=(v[be[x]][i]+1)%n; }else ne[fi[x]]=ne[x],fi[ne[x]]=fi[x],fa[x]=ne[x]; } int main(){ T=read(); while (T--){ n=read();s=read()%n;q=read();p=read();m=read();d=read(); mmh=0; for (int i=1;i<n;i++) c[i]=(1LL*c[i-1]*q+p)%m; for (int i=0;i<n;i++) ne[i]=(i+d)%n,fi[ne[i]]=i,fa[i]=i,bo[i]=0; m=0; for (int i=0;i<n;i++) if (!bo[i]){ m++; v[m].push_back(i);be[i]=m; for (int j=ne[i];j!=i;j=ne[j]) bo[j]=1,be[j]=m,v[m].push_back(j); } pos[0]=s;del(s); for (int i=1;i<n;i++) pos[i]=gf(c[i]%=n),del(pos[i]); memset(bo,0,sizeof(bo)); for (int i=0;i<n;i++) if (pos[i]!=i&&!bo[i]){ for (mmh++,m=i;!bo[m];)mmh++,bo[m]=1,m=pos[m]; } printf("%d\n",mmh-(s?2:0)); for (int i=1;i<=m;i++) v[i].clear(); } }
bzoj1998: [Hnoi2010]Fsk物品調度