码迷,mamicode.com
首页 > 其他好文 > 详细

CCPC 2019 网络赛 1002 array (权值线段树)

时间:2019-08-28 12:43:34      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:eof   cst   max   void   algorithm   权值线段树   define   clu   区间   

HDU 6703

?

题意:

? 给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\)\(a[i]\) 互不相同。
? 有两种操作:1. 将 \(a[pos]\) 的值加上 100000000;2. 询问不等于任何 \(a[i], (1 \le i \le r)\) 且不小于 \(k\) 的最小值。
?

思路:

? 注意 \(n,k\) 的范围都不超过 100000,对于操作一,相当于删除了这个数(询问的答案一定在区间 \([1, n]\) 内)。
?

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r

const int maxn = 100010;
const int INF = 0x3f3f3f3f;
int tree[maxn<<2];
int arr[maxn];
int id[maxn];

void build(int rt, int l, int r) {
    if(l==r) {
        tree[rt] = id[l];
        return;
    }
    int mid = (l+r)>>1;
    build(lson);
    build(rson);
    tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
}


int query(int L, int R, int rt, int l, int r, int val) {
    if(l==r) {
        return l;
    }

    int ans = INF;
    int mid = (l+r)>>1;

    if(L<=mid && val<tree[rt<<1])
        ans = query(L, R, lson, val);
    if(ans!=INF) return ans;

    if(mid<R && val<tree[rt<<1|1])
        ans = query(L, R, rson, val);
    return ans;
}

void update(int rt, int l, int r, int val) {
    if(l==r) {
        tree[rt] = INF;
        return;
    }

    int mid = (l+r)>>1;
    if(val<=mid) 
        update(lson, val);
    else
        update(rson, val);

    tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
}

int n, m;
int main() {
    int t; cin>>t;
    while(t--) {
        scanf("%d %d", &n, &m);
        int len = 0;
        for(int i=1;i<=n;i++) {
            scanf("%d", &arr[i]);
            id[arr[i]] = i;
            len = max(len, arr[i]);
        }


        id[++len] = INF;

        build(1, 1, len);

        int ans = 0;
        while(m--) {
            int op;
            scanf("%d", &op);
            if(op==1) {
                int pos;     
                scanf("%d", &pos);
                pos = pos^ans;
                update(1, 1, len, arr[pos]);
            } else {
                int r, k;
                scanf("%d %d", &r, &k);
                r = r^ans, k = k^ans;

                ans = query(k, len, 1, 1, len, r);
                printf("%d\n", ans);
            }
        }
        memset(id, 0, sizeof(id));
    }    

    return 0;
}

CCPC 2019 网络赛 1002 array (权值线段树)

标签:eof   cst   max   void   algorithm   权值线段树   define   clu   区间   

原文地址:https://www.cnblogs.com/izcat/p/11423103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!