1819 鬱悶的出納員之樹狀陣列解法

2021-06-08 11:54:11 字數 875 閱讀 7985

這個題目最近很火呵,fallingflowers的空間有sbt的解法,我又從icecream那學來了線段樹的解法。最近在網上發現樹狀陣列有查詢第k大的功能,想到用在這個題目上,於是有了樹狀陣列解法,試了一下,速度很快,0.45s,樹狀陣列的效率還真是bt啊。

這個題目的要求就是插入元素,刪除元素,查詢第k大。插入就不用說了,刪除的時候用乙個堆儲存插入過的元素,然後從前到後依次刪除,直到堆頂元素不小於給定的下界即可。查詢第k大的**見下:(有些地方我自己修改了一下,感覺網上的版本有些不太對)

int findk(int k)

return pos + 1;

}這樣三個功能就都實現了,其餘要注意的就是由於要維護乙個偏移量(統一加減工資),因此在插入元素的時候要加上乙個值,防止插入的元素是負的。

主程式見下:

#include

#include

#include

#define max 200010

#define inc 10001

using namespace std;

int n, delta, v, down, cnt;

char op[4];

while (scanf("%d %d", &n, &down) == 2)

else if (op[0] == 'i')

}else if (op[0] == 'a')

delta += v;

else}}

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

}明天有空再寫下線段樹的版本。樹狀陣列就是應用範圍太窄,要不然真就是perfect了。

p.s.用樹狀陣列求第k大的**有些問題,中間運算會溢位,安全的方法是在開c陣列上界的時候要開到大於給定的上界的最小2的方冪那麼大。

鬱悶的出納員

這題坑死我了。oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣...

鬱悶的出納員 題解(Splay)

題面 用delta記錄對工資的加減,那麼新增節點時點權應 delta,輸出時 delta 幾種操作中減少工資較麻煩 1.delta val 2.刪點 求前驅轉到根,刪除左子樹 這裡的刪除不用乙個乙個暴力刪,直接斷掉子樹關係即可 至於求k大 我比較懶直接改成求size k 1小 逃 include i...

SBT模板 鬱悶的出納員 By Kuangbin

拿來當模板,bin哥別生氣哈 人一我百,人十我萬!追逐青春的夢想,懷著自信的心,永不放棄 by kuangbin 鬱悶的出納員 time limit 5000msmemory limit 65536kb64bit io format lld llu submit status system craw...