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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 6703 array(主席树 + set)

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 6703 array(主席树 + set) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

array

給一個全排列,接下來有兩種操作:

一、把pospospos位置上的值+10,000,000+10,000,000+10,000,000

二、查詢[1,r][1, r][1,r]區間,沒有出現的且≥k\geq kk的最小值是多少。

考慮用主席樹 + set 求解,

先建立一顆主席樹,每個葉節點的權值為其所代表的區間(一個點)的值,然后維護區間最小值即可。

然后權值插入,每次把這個點的權值跟新為infinfinf,這一步也可以理解為,在這個區間出現的數就是infinfinf了,所以我們只要查詢最小值即可求得這個區間沒有出現得數。

思考一下,我們的答案只可能≤n+1\leq n + 1n+1,所以對于操作一,我們把修改得權值加入setsetset,對于操作二,我們在對應主席樹上查找區間最小值即可,然后與在setsetset查找得最優答案取minminmin即可。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10, inf = 0x3f3f3f3f;int a[N], n, m;int ls[N << 5], rs[N << 5], minn[N << 5], root[N], cnt;void push_up(int rt) {minn[rt] = min(minn[ls[rt]], minn[rs[rt]]); }void build(int &rt, int l, int r) {rt = ++cnt;if (l == r) {minn[rt] = l;return ;}int mid = (l + r) >> 1;build(ls[rt], l, mid);build(rs[rt], mid + 1, r);push_up(rt); }void update(int &rt, int pre, int l, int r, int x, int v) {rt = ++cnt, ls[rt] = ls[pre], rs[rt] = rs[pre], minn[rt] = minn[pre];if (l == r) {minn[rt] = v;return ;}int mid = (l + r) >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);}push_up(rt); }int query(int rt, int l, int r, int L, int R) {if (l >= L && r <= R) {return minn[rt];}int mid = (l + r) >> 1, ans = 0x3f3f3f3f;if (L <= mid) {ans = min(ans, query(ls[rt], l, mid, L, R));}if (R > mid) {ans = min(ans, query(rs[rt], mid + 1, r, L, R));}return ans; }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T;scanf("%d", &T);while (T--) {scanf("%d %d", &n, &m);const int N = n + 1;cnt = 0;build(root[0], 1, N);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);update(root[i], root[i - 1], 1, N, a[i], inf);}int last = 0, op, t1, t2;set<int> st;for (int i = 1; i <= m; i++) {scanf("%d %d", &op, &t1);if (op == 1) {t1 ^= last;st.insert(a[t1]);}else {scanf("%d", &t2);t1 ^= last, t2 ^= last;last = inf;last = query(root[t1], 1, N, t2, N);auto it = st.lower_bound(t2);if (it != st.end()) {last = min(last, *it);}printf("%d\n", last);}}}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的HDU 6703 array(主席树 + set)的全部內容,希望文章能夠幫你解決所遇到的問題。

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