日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jzoj3162 旋转

發布時間:2024/10/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]); }

轉載于:https://www.cnblogs.com/Extended-Ash/p/8312586.html

總結

以上是生活随笔為你收集整理的Jzoj3162 旋转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。