alice和bob發明了乙個新的旋轉遊戲。首先,bob給定n個數組成的序列,並把該序列平均分配成若干個塊,每塊正好包含k個數(k能整除n)。第一塊由第1到第k個數構成,第二塊由第k+1個數到第2k個數構成,以此類推。
接著,bob要求alice對這個序列進行一系列操作,操作有以下兩種:
1.把每塊裡面的數向左或右旋轉x個位置;
2.把整個序列向左或向右旋轉x個位置。
注意操作2會改變每一塊裡面的數。在執行完一系列操作後,alice把最終的序列告訴了bob。bob的任務就是找到初始序列。
這題,首先我們可以發現,若視塊中所有同乙個位置的數為乙個團,那麼我們只要知道這個團某乙個數的位置我們就可以還原這個團在整個佇列中的位置,這樣我們只要知道所有團某乙個數的位置就行了。
然而這並不好做,但有這個思路就行了。
對於乙個團的某個數的位置(我們就看做是維護起始位置的數吧),那麼我們可以將其位置表示成(x,y),表示成在第x個塊中第y個。
對於y,我們可以發現,所有操作,我們維護i,塊裡第乙個團的位置,這個用指標移動一下就行了,那麼就可以還原塊裡團的順序,這樣就知道y了。
對於x,我們可以發現,只有2操作讓同乙個團裡數的順序改變,用陣列yy字首和一下就可以了。
具體可視**
貼**
#include
#include
#include
#define n 100001
using namespace std;
int n,k,q,top;
int a[n][2],b[n],ans[n],d[n];
void init()
for (int i=1;i<=n;i++)
scanf("%d",&b[i]);
}int did(int
x)void work()
}x=(x+((-a[i][1])%k+k)%k)%k;
if (!x)x=k;
}kk=n/k;
for (int i=2;i<=k;i++)
d[i]+=d[i-1];
for (int i=1;i<=k;i++)
for (int j=1;j<=kk;j++)
x=x%k+1;
}}void write()
int main()
GDOI2016模擬8 8處理器
題目 你有乙個微型處理器,處理器有n個暫存器,編號為1到n,每個暫存器用二進位制儲存乙個32位無符號整數 取值範圍為0到2 32 1 儲存器能執行以下操作 指令 描述 example 1 k m 把暫存器k裡面的數字向右旋轉m位,再把結果寫進暫存器k。000000000000000000100011...
GDOI2016模擬8 13總結
這次考差了。但事後想了一下,感覺收穫好大。匯報做題情況 當然,裡面不包含收穫 第一題 我的暴力爆零了,原因又是爆int 做題過程中我想到了與眾不同的演算法,一般人會化簡不等式變成斜率優化做,但由於我對斜率優化不大敏感,而且一般斜率優化的題目都是用凸包 叉積來做,這題我也同樣想著用凸包做,但打完發現有...
GDOI2016模擬8 16幫派
農場裡的生活很艱苦,而且當生活很艱苦,你必須堅強起來。奶牛們形成了編號為1到m的幫派。這些幫派一開始和睦相處了一段時間,但是現在失控了!奶牛們在競爭一片大草地的控制權。奶牛之間的衝突發生在連續的若干分鐘內。每一分鐘有乙隻奶牛走進草地。如果此時草地上沒有奶牛,那麼這只新進去的奶牛所在的幫派就能占領這片...