zoukankan      html  css  js  c++  java
  • Jzoj3162 旋转

    Alice和Bob发明了一个新的旋转游戏。首先,Bob给定N个数组成的序列,并把该序列平均分配成若干个块,每块正好包含K个数(K能整除N)。第一块由第1到第K个数构成,第二块由第K+1个数到第2K个数构成,以此类推。
    接着,Bob要求Alice对这个序列进行一系列操作,操作有以下两种:
    1.把每块里面的数向左或右旋转X个位置;
    2.把整个序列向左或向右旋转X个位置。

        注意操作2会改变每一块里面的数。在执行完一系列操作后,Alice把最终的序列告诉了Bob。Bob的任务就是找到初始序列。

    非常好的题目,想了很久最后参考巨神的code才做出来的(可能是道水题而我太弱了。。。)

    我们用数对(x,y)来代表第xk+y个位置发生的变化

    让后考虑两种操作对数对的影响(左旋和右旋取模后是一样的)

    1操作,所有数对的y加上X,非常好处理

    2操作,这里要考虑两种变化,x的变化和y的变化

    y的变化和操作1类似,而右旋X个位置,会导致所有数对的x增加[X/k](相当于移动了X/k块)

    让后对一部分(应该是k-x%k+1,k)移动的部分还要+1,这部分可以用前缀和来处理,最后再做一次累加即可

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 100010
    using namespace std;
    int a[N],b[N],s[N],t[N],q[N],n,m,k;
    inline void add(int l,int r,int v){
    	if(l<=r){ s[l]+=v; s[r+1]-=v; }
    	else { s[0]+=v; s[l]+=v; s[r+1]-=v; }
    }
    int main(){
    	scanf("%d%d%d",&n,&k,&m);
    	for(int i=1;i<=m;++i) scanf("%d%d",t+i,q+i);
    	for(int i=0;i<n;++i) scanf("%d",a+i);
    	int p=0;
    	for(int x,y,i=m;i;--i){
    		if(t[i]==1) (p+=(q[i]%k+k)%k)%=k;
    		else {
    			x=(q[i]%n+n)%n;
    			y=x/k; add(0,k-1,y);
    			y=x%k; if(y) add(p,(p+y-1)%k,1);
    			p=(p+x)%k;
    		}
    	}
    	m=n/k;
    	for(int i=1;i<=k;++i) s[i]+=s[i-1];
    	for(int i=p,j=0;j<k;(++i)%=k,++j){
    		s[i]%=m;
    		for(int x=0;x<m;++x) b[j+x*k]=a[(i+s[i]*k+x*k)%n];
    	}
    	for(int i=0;i<n;++i) printf("%d ",b[i]);
    }

  • 相关阅读:
    【RAC】 RAC For W2K8R2 安装--RDBMS软件的安装(五)
    【RAC】 RAC For W2K8R2 安装--grid的安装(四)
    【RAC】 RAC For W2K8R2 安装--共享磁盘的配置(三)
    【RAC】 RAC For W2K8R2 安装--操作系统环境配置 (二)
    【RAC】 RAC For W2K8R2 安装--总体规划 (一)
    【OGG】 RAC环境下管理OGG的高可用 (五)
    【OGG】RAC环境下配置OGG单向同步 (四)
    【OGG】OGG简单配置双向复制(三)
    【OGG】OGG的单向复制配置-支持DDL(二)
    【OGG】OGG的单向DML复制配置(一)
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/8312586.html
Copyright © 2011-2022 走看看