bzoj1998: [Hnoi2010]Fsk物品调度
链接......不知道为啥放不动啊。
第一次用手机写bzoj的题,也是第一次用手机写的题解,顺便实现了一下手机上的对拍。
可以用链表+并查集维护一下什么的。
环之间的边是不是不太好路径压缩?
我是直接环内路径压缩,环外不管。
这样应该是会被卡的(d==n???)
可是交上去还是过了。
#include<vector> #include<cstdio> #include<cstring> #include<algorithm> #define MN 110001 using namespace std; int read_ca,read_p; inline int 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(); } }