時間限制: 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名是什麼的函...