P3207 [HNOI2010]物品调度

本文深入探讨了一种算法竞赛中高效解决特定类型问题的策略。通过并查集维护位置关系,实现对复杂状态的有效管理和更新。文章详细介绍了如何利用数学运算和数据结构优化问题求解过程,适用于竞赛中涉及大量数据处理和状态转移的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

完了题目看错了……还以为所有的\(x,y\)都要一样……结果题解都没看懂……
先考虑如果已经求出了所有的\(pos\)要怎么办,那么我们可以把\(0\)也看做是一个箱子,然后最后每个箱子都在一个环里。如果是自环无视,如果\(0\)在这个环里就用\(0\)做每次的中介把所有都换到正确的位置上,总共要\(L-1\)次,否则的话把\(0\)换进环里然后换完之后再换出去,总共要换\(L+1\)
我们发现随着\(x\)的增大,\(pos\)肯定是形成一个环的……随意就枚举\(y\)的值,然后看看这个环上还有没有空位可以放,有的话就放进去。总之就是用并查集维护,每次放完之后指向下一个能放的位置,即\(x+D\)

//minamoto
#include<bits/stdc++.h>
#define R register int
#define fp(i,a,b) for(R i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R i=a,I=b-1;i>I;--i)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R res,f=1;char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
const int N=1e5+5;
int n,S,Q,P,M,D,x,y,ans,cnt,tot,fa[N],C[N],pos[N];bool vis[N];
int find(R x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(R x,R y){fa[find(x)]=find(y);}
void solve(){
    n=read(),S=read(),Q=read(),P=read(),M=read(),D=read();
    fp(i,1,n-1)C[i]=(1ll*C[i-1]*Q+P)%M;fp(i,0,n-1)fa[i]=i;
    memset(vis,0,sizeof(vis)),pos[0]=S,vis[S]=true,merge(S,(S+D)%n);
    fp(i,1,n-1){
        x=find(C[i]%n),y=0;
        while(vis[x])++y,x=find((C[i]+y)%n);
        pos[i]=x,vis[x]=1,merge(x,(x+D)%n);
    }
    memset(vis,0,sizeof(vis)),ans=cnt=0;
    fp(i,0,n-1)if(!vis[i]){
        tot=0,x=i;
        while(!vis[x])++tot,vis[x]=true,x=pos[x];
        if(tot>1)ans+=tot,++cnt;
    }ans+=pos[0]?cnt-2:cnt;printf("%d\n",ans);
}
int main(){
//  freopen("testdata.in","r",stdin);
    int T=read();
    while(T--)solve();
    return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10055300.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值