日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

BZOJ 3585: mex( 离线 + 线段树 )

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3585: mex( 离线 + 线段树 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

離線, 詢問排序.

先處理出1~i的答案, 這樣可以回答左端點為1的詢問.完成后就用seq(1)將1到它下一次出現的位置前更新. 不斷這樣轉移就OK了

--------------------------------------------------------------------

#include<bits/stdc++.h>using namespace std;#define M(l, r) (((l) + (r)) >> 1)const int maxn = 200009;int id[maxn], N = 0, seq[maxn], n, T[maxn];bool F[maxn];struct link {int pos;link* next;} A[maxn], *head[maxn], *pit = A;struct Q {int l, r, p;inline void read(int _p) {scanf("%d%d", &l, &r); l--; r--;p = _p;}bool operator < (const Q &q) const {return l < q.l;}} B[maxn];struct Node {Node *l, *r;int tag;Node() {tag = -1;l = r = NULL;}inline void pushdown() {if(~tag) {l->tag = ~l->tag ? min(l->tag, tag) : tag;r->tag = ~r->tag ? min(r->tag, tag) : tag;tag = -1;}}} pool[maxn << 1], *pt = pool, *root;void build(Node* t, int l, int r) {if(r > l) {int m = M(l, r);build(t->l = pt++, l, m);build(t->r = pt++, m + 1, r);} else ? ?t->tag = T[l - 1];}int L, R, v;void modify(Node* t, int l, int r) {if(L <= l && r <= R) ? ?t->tag = ~t->tag ? min(t->tag, v) : v;else {t->pushdown();int m = M(l, r);if(L <= m) modify(t->l, l, m);if(m < R) modify(t->r, m + 1, r);}}int query(Node* t, int l, int r) {if(l == r) ? ?return t->tag;t->pushdown();int m = M(l, r);return L <= m ? query(t->l, l, m) : query(t->r, m + 1, r);}int ans[maxn];int main() {freopen("test.in", "r", stdin);freopen("test.out", "w", stdout);memset(head, 0, sizeof head);memset(F, false, sizeof F);int m;cin >> n >> m;for(int i = 0; i < n; i++) {scanf("%d", seq + i);id[i] = seq[i];}sort(id, id + n);N = unique(id, id + n) - id;for(int i = 0; i < n; i++) ? ?seq[i] = lower_bound(id, id + N, seq[i]) - id;for(int i = n - 1; ~i; i--) {int t = seq[i];pit->pos = i;pit->next = head[t];head[t] = pit++;}for(int i = 0; i < n; i++) {if(id[seq[i]] < maxn) F[id[seq[i]]] = true;T[i] = i ? T[i - 1] : 0;while(F[T[i]]) T[i]++;}build(root = pt++, 1, n);for(int i = 0; i < m; i++) ? ?B[i].read(i);sort(B, B + m);int p = 0;for(int i = 0; i < n; i++) {while(p < m && B[p].l == i) {L = B[p].r + 1;ans[B[p].p] = query(root, 1, n);p++;}if(i == n - 1 || p >= m) break;head[seq[i]] = head[seq[i]]->next;L = i + 1; R = head[seq[i]] ? head[seq[i]]->pos : n; v = id[seq[i]];modify(root, 1, n);}for(int i = 0; i < m; i++) ? ?printf("%d\n", ans[i]);return 0;}

--------------------------------------------------------------------?

3585: mex

Time Limit:?20 Sec??Memory Limit:?128 MB
Submit:?454??Solved:?232
[Submit][Status][Discuss]

Description

  有一個長度為n的數組{a1,a2,...,an}。m次詢問,每次詢問一個區間內最小沒有出現過的自然數。

Input

  第一行n,m。
  第二行為n個數。
  從第三行開始,每行一個詢問l,r。

Output

  一行一個數,表示每個詢問的答案。

Sample Input

5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5

Sample Output

1
2
3
0
3

HINT

數據規模和約定

  對于100%的數據:

  1<=n,m<=200000

  0<=ai<=109

  1<=l<=r<=n


  對于30%的數據:


  1<=n,m<=1000

Source

By 佚名提供

?

轉載于:https://www.cnblogs.com/JSZX11556/p/4708066.html

總結

以上是生活随笔為你收集整理的BZOJ 3585: mex( 离线 + 线段树 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。