樹樁陣列維護區間不同值的個數

2022-04-30 01:54:09 字數 999 閱讀 7696

題目

結果只有80分,不夠學了一招。

將問題轉化為離線問題。

我們先將詢問按右節點公升序排序。

然後對於每乙個值,我們可以肯定的是,只有最靠近詢問右端的值才可能起作用。

case 1 :如果詢問不包括某個值。那麼這個值,對答案沒有影響

case 2 :包括的話,那麼至少包括1個這樣的值,而我們詢問的是不同的個數,所以對答案也沒有影響

這樣的話,我們只需要維護最靠右的位置在哪就行了。

#include#include#includeusing namespace std;

struct bit

} int sum(int pos)

return ans;

} int check(int l,int r) };

bit bit;

int last[1000100];

int base[500100];

int ans[200100];

struct node

;bool compare(const node &a,const node &b)

while(in>='0'&&in<='9')

return s*f;

}node query[200100];

int main()

sort(query+1,query+1+m,compare);//排序,左端點其實可以不拍

int i=0;//i是當前遍歷到的右端點

for(int j=1;j<=m;j++)

else

}//printf("%d\n",bit.check(query[i].left,query[i].right));

ans[query[j].num]=bit.check(query[j].left,query[j].right);

} for(i=1;i<=m;i++)

printf("%d\n",ans[i]);

}

樹狀陣列維護區間最值

題目描述 給你乙個1 n的排列和乙個棧,入棧順序給定 你要在不打亂入棧順序的情況下,對陣列進行從大到小排序 當無法完全排序時,請輸出字典序最大的出棧序列 輸入描述 第一行乙個數n 第二行n個數,表示入棧的順序,用空格隔開,結尾無空格 輸出描述 輸出一行n個數表示答案,用空格隔開,結尾無空格 示例1輸...

求區間不同數字的個數和和

1 byte 8 bit 1 kb 1,024 bytes 1 mb 1,024 kb 1,048,576 bytes 乙個int是4位元組即4byte.求個數和求和類似,不過是在更新的時候把1變成了這個數的值,下面就講講求區間不同數字的個數。首先我們思考對於右端點固定的區間 即r確定的區間 我們如...

查詢任意區間內不同元素的個數

include using namespace std define ll long long const int maxn 2e5 5 const int mod 1e9 7 const double eps 1e 9 const double pi acos 1.0 const int inf ...