bzoj4415 樹狀陣列 發牌

2021-08-18 13:24:17 字數 1386 閱讀 4767

description

假設一開始,荷官拿出了一副新牌,這副牌有n張不同的牌,編號依次為1到n。由於是新牌,所以牌是按照順序排好的,從牌庫頂開始,依次為1,

2,……直到n,n號牌在牌庫底。為了發完所有的牌,荷官會進行n次發牌操作,在第i次發牌之前,他會連續進行r_i次銷牌操作,r_i由輸入給定。請問最後玩家拿到這副牌的順序是什麼樣的?

舉個例子,假設n = 4,則一開始的時候,牌庫中牌的構成順序為。

假設r1=2,則荷官應該連銷兩次牌,將1和2放入牌庫底,再將3發給玩家。目前牌庫中的牌順序為。

假設r2=0,荷官不需要銷牌,直接將4發給玩家,目前牌庫中的牌順序為。

假設r3=3,則荷官依次銷去了1, 2, 1,再將2發給了玩家。目前牌庫僅剩下一張牌1。

假設r4=2,荷官在重複銷去兩次1之後,還是將1發給了玩家,這是因為1是牌庫中唯一的一張牌。

input

第1行,乙個整數n,表示牌的數量。第2行到第n + 1行,在第i + 1行,有乙個整數r_i, 0≤r_i < n

output

第1行到第n行:第i行只有乙個整數,表示玩家收到的第i張牌的編號。

sample input

sample output

hint

n<=70萬

題解

學習樹狀陣列找第k小的了

參考了這篇blog

其實就相當於乙個不斷逼近的過程

對於這道題,你維護乙個當前牌的位置,然後找一下第k小的就ok了

#include

#include

#include

#include

#include

using

namespace

std;

bool v[710000];

int n,pos,now;

int s[710000];

int lowbit(int x)

void change(int x,int c)}

int r;

int fd(int p)

int main()

*/scanf("%d",&r);

now=(now+r)%i;if(now==0)now+=i;

int tmp=fd(now);

printf("%d\n",tmp);

}return

0;}

bzoj4415 Shoi2013 發牌 線段樹

相當於找區間第k個數,同時支援刪點 這個題的線段樹操作和noid1t1有點像。所以調了半天。注意對size取模,注意查詢區間第k的時候的特判 碼 include includeusing namespace std define zuo o 1,l,mid define you o 1 1,mid ...

bzoj1246(樹狀陣列)

樹狀陣列的靈活運用,維護的是最大值,因為整個陣列就是乙個字首最大值,所以可以用實現,求乙個字首最大值,和更新pos之後的最大值。很好的運用,多回顧思考 include include include include includeusing namespace std const int n 200...

bzoj 2762 樹狀陣列

題意 給出一些形如 ax b 1 新加入乙個不等式 2 刪除乙個不等式 3 詢問當x k時滿足的不等式的個數 對於每乙個不等式,通過變形就可以得到使它成立的x的範圍 那麼就變成區間修改,單點查詢,樹狀陣列維護就好 注意 1 討論a 0 a 0 a 0的情況 2 由於k有非正數,所以要加上10 6 1...