Codevs 1282 約瑟夫問題

2022-02-27 10:47:54 字數 1396 閱讀 1326

時間限制: 1 s

空間限制: 128000 kb

題目等級 : 大師 master

有編號從1到n的n個小朋友在玩一種出圈的遊戲。開始時n個小朋友圍成一圈,編號為i+1的小朋友站在編號為i小朋友左邊。編號為1的小朋友站在編號為n的小朋友左邊。首先編號為1的小朋友開始報數,接著站在左邊的小朋友順序報數,直到數到某個數字m時就出圈。直到只剩下1個小朋友,則遊戲完畢。

現在給定n,m,求n個小朋友的出圈順序。

輸入描述 input description

唯一的一行包含兩個整數n,m。(1<=n,m<=30000)

輸出描述 output description

唯一的一行包含n個整數,每兩個整數中間用空格隔開,第i個整數表示第i個出圈的小朋友的編號。

樣例輸入 sample input

5 3樣例輸出 sample output

3 1 5 2 4

分析 analysis

現在有乙個標準的1-n的遞增排列

擊鼓傳花,每次數到 m 時就要去掉當前這個元素,然後繼續從 0 計數

那麼定義 sum( i ) 為元素 i 之前的當前實際存在的元素數,在計算過程中,sum( i ) 才是真正的位置

那麼給每乙個元素乙個初始權值 1 ,維護每個元素以自己為端點的字首和,就能愉快的計算 sum( i ) 啦

但是我們計算的時候要把pos+1

那麼線段樹的內容就是維護字首和且單點置零啦

注意查詢

這次的線段樹被閹割的非常閹割

** code

1 #include2 #include3

#define mid (l+r)/2

4#define lc (rt<<1)

5#define rc (rt<<1|1)

6#define maxn 1000000

7using

namespace

std;89

inttree[maxn],n,m;

10void maintain(int rt)

11void build(int rt,int l,int

r)18}19

void modify(int rt,int l,int r,int

pos)26}

27int query(int rt,int l,int r,int val,int

remain)33}

3435

intmain()

5051

return0;

52 }

閹割的非常嚴重的線段樹

Codevs 1282 約瑟夫問題

1282 約瑟夫問題 時間限制 1 s 空間限制 128000 kb 題目描述 description 有編號從1到n的n個小朋友在玩一種出圈的遊戲。開始時n個小朋友圍成一圈,編號為i 1的小朋友站在編號為i小朋友左邊。編號為1的小朋友站在編號為n的小朋友左邊。首先編號為1的小朋友開始報數,接著站在...

Codevs 1282 約瑟夫問題 線段樹

codevs 1282 約瑟夫問題 首先,建樹,根節點 l 1,r n,sum n sum 指的是在這個區間內 還剩下的人數。主函式乙個 while 迴圈,一直迴圈到根節點 為 0 也就是所有人都出圈了。另外 根節點的sum tree 1 sum 代表還沒出圈的還有多少人。我們可以將 圓圈看為乙個佇...

wikioi 1282 約瑟夫問題

這道題所用到的資料結構應該是名次樹,名次樹可以由線段樹實現也可以由樹狀陣列實現。而對於類似這道題這樣的乙個只需要刪除和查詢操作的名次樹而言,可以用樹狀陣列實現,因為用樹狀陣列實現無論效率還是 複雜度都較線段樹而言更優,雖然演算法較線段樹而言更加巧妙。首先,這個資料結構需要乙個用於查詢第k名是什麼的函...