zoukankan      html  css  js  c++  java
  • 牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组, 离线)

    题意:

    给定n个数字, 然后给出m个区间, 求区间外其他数字的种类有多少。

    分析:

    将区间以r为基准升序排序, 每次处理pre~r的数字第一次出现的位置。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxN = 2e6 + 7;
    int a[maxN], bit[maxN], ans[maxN];
    int n, q;
    int lowbit(int x){
        return x & -x;
    }
    int sum(int x){
        int res = 0;
        while(x > 0){
            res += bit[x];
            x -= lowbit(x);
        }
        return res;
    }
    void update(int x, int v){
        while(x <= n){
            bit[x] += v;
            x += lowbit(x);
        }
    }
    struct Interval{
        int l , r, id;
        bool operator <(const Interval& tmp)const {
            return r < tmp.r;
        }
    }s[maxN];
    int main(){
    //    freopen("1.txt","r", stdin);
        while(~scanf("%d %d", &n, &q)){
            for(int i = 1; i <= n; i++){
                scanf("%d", &a[i]);
                a[n + i] = a[i];
                bit[n + i] = bit[i] = 0; //先初始化为0
            }
            for(int i = 0; i < q; i++){
                scanf("%d %d", &s[i].r, &s[i].l);
                s[i].r += n;
                s[i].id = i;
            }
            n *= 2;
    
            sort(s, s + q);
            map<int, int> mp;
            int pre = 1;
            for(int i = 0; i < q; i++){
                int L = s[i].l , R = s[i].r, id = s[i].id;
    
                for(int j = pre; j <= R; j++){
                    int num = a[j];
                    if(mp.count(num)){
                        update(mp[num], -1); //如果之前出现过, 那么消去之前的标记
                    }
                    update(j, 1); //这个位置设为最后一次出现
                    mp[num] = j; //更新这个数最后一次出现的位置
    //                for(int i = 1; i <= R; i++)  cout << bit[i] << " "; cout << "
    ";
                }
                pre = R + 1;
                ans[id] = sum(R) - sum(L - 1);
            }
            for(int i = 0; i < q; i++){
                printf("%d
    ", ans[i]);
            }
        }
    }
  • 相关阅读:
    cf D. Vessels
    cf C. Hamburgers
    zoj 3758 Singles' Day
    zoj 3777 Problem Arrangement
    zoj 3778 Talented Chef
    hdu 5087 Revenge of LIS II
    zoj 3785 What day is that day?
    zoj 3787 Access System
    判断给定图是否存在合法拓扑排序
    树-堆结构练习——合并果子之哈夫曼树
  • 原文地址:https://www.cnblogs.com/Jadon97/p/9439594.html
Copyright © 2011-2022 走看看