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]);
            }
        }
    }
  • 相关阅读:
    NLTK学习笔记(三):NLTK的一些工具
    NLTK学习笔记(四):自然语言处理的一些算法研究
    NLTK学习笔记(五):分类和标注词汇
    深入C++的运算符重载
    python3实现TCP协议的简单服务器和客户端
    python3实现UDP协议的简单服务器和客户端
    Windows平台下python2和3的兼容问题解决
    异常处理
    内置方法
    反射:hasattr、getattr、setattr、delattr
  • 原文地址:https://www.cnblogs.com/Jadon97/p/9439594.html
Copyright © 2011-2022 走看看