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

Posted izcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCPC 2019 网络赛 1002 array (权值线段树)相关的知识,希望对你有一定的参考价值。

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 (权值线段树)的主要内容,如果未能解决你的问题,请参考以下文章

2018 CCPC网络赛 几道数学题

CCPC网络赛2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛) 签到题5题

hdoj6703 2019 CCPC网络选拔赛 1002 array

CCPC2019网络赛

2019 CCPC网络赛

CCPC2019网络赛