• 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)


    找环

    考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现。

    因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了。

    貌似比我比赛时被卡成(30)分的倍增简单多了?

    代码

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 500000
    #define pb push_back
    #define LL long long
    using namespace std;
    int n,k,a[N+5],fa[N+5],q[N+5],p[N+5];
    vector<int> v[N+5];
    class FastIO
    {
    	private:
    		#define FS 100000
    		#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
    		#define pc(c) (C==E&&(clear(),0),*C++=c)
    		#define tn (x<<3)+(x<<1)
    		#define D isdigit(c=tc())
    		int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
    	public:
    		I FastIO() {A=B=FI,C=FO,E=FO+FS;}
    		Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
    		Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
    		Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
    		Tp I void writeln(Con Ty& x) {write(x),pc('
    ');}
    		I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
    }F;
    int main()
    {
    	freopen("shuffle.in","r",stdin),freopen("shuffle.out","w",stdout);
    	RI Qt,i,j,x,y;LL s=0;F.read(n,Qt,k);
    	for(i=1;i<=n;i+=2) a[i]=i+1>>1;for(i=2;i<=n;i+=2) a[i]=i+n>>1;//初始化置换
    	for(i=1;i<=k;++i) fa[i]=a[n-k+i];for(i=k+1;i<=n;++i) fa[i]=a[i-k];//初始化置换
    	for(x=0,i=1;i<=n;++i) if(!q[i]) {++x,y=0,j=i;W(v[q[j]=x].pb(j),p[j]=y++,!q[j=fa[j]]);}//找环
    	W(Qt--) F.read(x,y),s+=x,F.writeln(v[q[y]][(p[y]+s)%v[q[y]].size()]);return F.clear(),0;//输出环上对应位置
    }
    
  • 相关阅读:
    CI框架主题切换的功能
    centos7 编译安装 php7.4
    单用户登陆demo-后者挤到前者,类似QQ
    nginx 负载均衡的配置
    PHP计算每月几周,每周的开始结束日期
    Centos7 编译安装PHP7
    TP 3.2.3 接入PHPMailer
    外部js引用vue实例环境的方式
    linux常用命令
    计算机中的二级制
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Contest20190716T1.html
Copyright © 2020-2023  润新知