樹狀陣列 csu 1933

2021-08-01 15:52:43 字數 1143 閱讀 8101

小明家門口有乙個賣飲料的自動售貨機,小明經常在那裡買飲料。

每種飲料有乙個流行度,表示它在市場上流行的程度,為了顯示自己的與眾不同,小明從來不買流行度大於t的飲料。

售貨機上有三種操作:

1 在貨架上新增一種流行度為x的飲料,並以j作為該飲料的編號,j表示該飲料是第j個被新增的飲料(j從1開始計數)。

2 編號為x的飲料已售罄。

3 小明嘗試買第x流行的飲料。

第一行乙個整數t。

接下來若干行每行兩個整數i,x。1<=i<=3 表示該操作是第i種操作。

輸入以只包含乙個整數0的一行結束。

0106

對每個i=3的操作:

如果小明嘗試買的飲料流行度v>t,輸出"sorry.";

如果小明嘗試買的飲料流行度v<=t,並且未售罄,輸出該飲料的流行度;

如果小明嘗試購買的飲料已賣完,輸出"meiyou.".

每個輸出佔一行。

99

1 100

3 11 99

1 99

1 99

2 42 2

3 20

sorry.

99

樹狀陣列加二分的模板,首先,樹狀陣列c[i]儲存的是a[i-2^k+1]至a[i]的和,通過樹狀陣列我們可以在log(n)時間內輕鬆求陣列的字首和和子段和,考慮到這種情況,陣列的字首和一定是非遞減的,所以可以使用二分,我們只要將擁有的流行度的飲料建成乙個樹狀陣列通過求字首和來確定前面有多少種類飲料,二分時候,假設我們要求第i流行的飲料,最後二分到第乙個sum(字首和)等於第i流行的飲料即可,二分區間為【left,right)左閉右開,所以二分時right=mid。

#include #include #include #define siz 1000005

#include using namespace std;

int arr[siz],t,i,inde,ssum;

int vis[siz],c[siz],a[siz];

int lowbit(int x)

void insert(int index,int x)

return sum;

}int erfen(int zx)

//cout// cout<<"sorry."<

csu 1757 貪心或者樹狀陣列

time limit 1 sec memory limit 128 mb submit 209 solved 51 submit status web board 火車站人們總是在站台等待列車進站,乙個站台有火車停留的時候就不能有其他火車進入,今天有n輛火車經過,已知它們進站時間si以及出站時間ti...

csu 1770按鈕控制彩燈實驗 樹狀陣列

time limit 1 sec memory limit 128 mb submit 194 solved 65 submit status web board 應教學安排,yy又去開心的做電學實驗了。實驗的內容分外的簡單一串按鈕通過程式設計了的eeprom可以控制一串彩燈。然而選擇了最low的一...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...