首页 > 代码库 > bzoj1998: [Hnoi2010]Fsk物品调度

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

 

bzoj1998: [Hnoi2010]Fsk物品调度