1. 程式人生 > >bzoj1998: [Hnoi2010]Fsk物品調度

bzoj1998: [Hnoi2010]Fsk物品調度

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;
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(); } }
View Code

bzoj1998: [Hnoi2010]Fsk物品調度