題目鏈結
給你乙個數列代表不同的顏色(可以修改)。
詢問一段區間內有多少種顏色。
很容易想到的就是線段樹來維護bitset。
這裡為了練習,使用分塊維護bitset。
* 事實上線段樹可以看成是無限分塊。*
修改的時候直接暴力將被修改位置所在的塊重新計算,形成新的bitset。
查詢的時候,直接按塊合併bitset即可。
注意細節:由於bitset不能開太大,因此有必要將給出的顏色進行離散化。
我採用的方法是使用unordered_map進行離散化,簡單易行。
#include
#include
using
namespace
std;
int n,m,l,r;
int a[10007];
bitset
<12007> block[107];
bitset
<12007> now;
int base = 100;
unordered_map
mpid;
inline
int getid(int x)
int main()
scanf("%d",&a[i]);
now.set(getid(a[i]));
}block[n/base] = now;
char op;
while(m--)
for(;(r+1) % base != 0 && r >= l;--r)
if(l >= r)
int bl = l / base,br = r / base;
for(;bl <= br;++bl)
now |= block[bl];
printf("%d\n",now.count());
}else
}}
Bzoj2120 洛谷P1903 數顏色(莫隊)
bzoj 洛谷考慮對操作離線後分塊處理詢問操作 莫隊演算法 將詢問操作按照編號分塊後左端點第一關鍵字,右端點第二關鍵字排序 分塊大小為 n 對於每乙個詢問操作,記下當前最後乙個修改操作。之後就是莫隊的板子了。include include include include include using ...
P1903 國家集訓隊 數顏色 維護佇列
h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 這道題的帶修版本 s ol utio nsolution soluti on原來那道靜態主席樹就可以解決了,這道當然是樹套樹啦 可是,原來那道莫隊不是也...
洛谷P3939 數顏色
題目大意 有n個物品,每個物品有乙個顏色。現在有兩種操作 1.查詢l r內有多少顏色為c的物品並輸出。2.將第x個物品和第x 1個交換。現在讓你實現這些操作。解題思路 首先一共有300000種顏色,最多只有300000個物品,但如果直接開陣列,結果可想而知。所以考慮用vector儲存每種顏色的編號。...