HDU 6703 array(主席树 + set)
生活随笔
收集整理的這篇文章主要介紹了
HDU 6703 array(主席树 + set)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
array
給一個全排列,接下來有兩種操作:
一、把pospospos位置上的值+10,000,000+10,000,000+10,000,000。
二、查詢[1,r][1, r][1,r]區間,沒有出現的且≥k\geq k≥k的最小值是多少。
考慮用主席樹 + set 求解,
先建立一顆主席樹,每個葉節點的權值為其所代表的區間(一個點)的值,然后維護區間最小值即可。
然后權值插入,每次把這個點的權值跟新為infinfinf,這一步也可以理解為,在這個區間出現的數就是infinfinf了,所以我們只要查詢最小值即可求得這個區間沒有出現得數。
思考一下,我們的答案只可能≤n+1\leq n + 1≤n+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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东电脑数码教你来选购京东买电脑如何选购
- 下一篇: 针对猫咪总凑到电脑前捣乱的世界难题,这位