有乙個長度為n的陣列。m次詢問,每次詢問乙個區間內最小沒有出現過的自然數。
考慮用線段樹維護,維護什麼?
我們把這些點分布在數軸上,那麼我們要在這個數軸上找到答案,就要把區間轉換到數軸上,也就是要維護每個數的下標。
那麼滿足維護這個東西的,可以用權值線段樹。
這樣,我們可以衍生出兩種做法:
離線做法:把所有的詢問按照右端點排序,這樣我們逐個加入節點(用於確定右端點),在權值線段樹中查詢比左端點下標小的區間,那麼答案肯定在這裡面,因為找到的權值下標不可能大於等於
l 。
注意:a
i很大,但我們發現答案最大為n+
1 ,於是所有的大於
n 的ai
可直接修改為n+
1 ,線段樹就可以用堆式儲存。(這樣比我打的動態開節點**量節省許多)
詢問中的
r 可能有很多重複,注意判斷即可。
#include
#include
#include
#include
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define n 200001
#define m 1000000000
using
namespace
std;
struct nodeb[n];
struct dyz[n*10];
int tr[n*10];
int tot=1;
int c[n];
bool cmp(node x,node y)
int mid=(l+r)/2;
if(x<=mid)
else
tr[v]=min(tr[z[v].l],tr[z[v].r]);
}int find(int v,int l,int r,int x)
int main()
sort(b+1,b+m+1,cmp);
int p=0;
fo(i,1,n)
}fo(i,1,m) printf("%d\n",c[i]);
}
清華集訓2014 mex
有乙個長度為n的陣列。m次詢問,每次詢問乙個區間內最小沒有出現過的自然數。顯然,當 a i n 時,對答案沒有影響,所以全部視為n 1。有兩種方法,主席樹和權值線段樹。主席樹裸題,就講權值線段樹。首先將詢問按r排序,將1 r的 a i 全部加入權值線段樹,記錄它最晚出現的位置,對於每個區間記錄這個區...
清華集訓 2014 玄學
update text update 我之前講的是個什麼鬼 如果想看看人話版本 戳這。感覺自己被坑騙了。題目明明寫了所有資料不超過int,敢情是輸入資料不超int?迷惑行為 題目感覺有點繞,我盡量 不口胡。首先我們搞一顆線段樹1,樹表示插入序列的編號。如,在q行中第i個出現插入操作 其實拿到這道題我...
46 清華集訓2014 玄學
一開始腦子進水了 把這題想簡單了 複雜度算錯了 每次都用nlogn的時間修改 而且還狂寫stl 然後就直播自爆8小時qaq。先掛個5分 include include include include include includeusing namespace std define rep i,j,...