zoukankan      html  css  js  c++  java
  • D-query SPOJ

    Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the subsequence ai, ai+1, ..., aj.

    Input
    Line 1: n (1 ≤ n ≤ 30000).
    Line 2: n numbers a1, a2, ..., an (1 ≤ ai ≤ 106).
    Line 3: q (1 ≤ q ≤ 200000), the number of d-queries.
    In the next q lines, each line contains 2 numbers i, j representing a d-query (1 ≤ i ≤ j ≤ n).
    Output
    For each d-query (i, j), print the number of distinct elements in the subsequence ai, ai+1, ..., aj in a single line.
    Example
    Input
    5
    1 1 2 1 3
    3
    1 5
    2 4
    3 5

    Output
    3
    2
    3

    题意:
    给你一个长度为n的数组,和m个询问,对于每一个询问,请你输出数组在 l 到 r 区间中,有多少个不同的数字。
    思路:

    用一个flag[i] 数组 表示当前区间中出现了多少次i数字。

    利用flag数组进行常规的add、del 转移即可。

    细节见代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #include <iomanip>
    #define ALL(x) (x).begin(), (x).end()
    #define sz(a) int(a.size())
    #define all(a) a.begin(), a.end()
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define eps 1e-6
    #define gg(x) getInt(&x)
    #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
    using namespace std;
    typedef long long ll;
    ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
    ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
    ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2) { ans = ans * a % MOD; } a = a * a % MOD; b /= 2;} return ans;}
    inline void getInt(int *p);
    const int maxn = 1000010;
    const int inf = 0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    pll ans[maxn];
    ll Ans = 0ll;
    int l = 0;
    int r = 0;
    struct node {
        int l, r, id;
    } a[maxn];
    int pos[maxn];
    int n, m;
    int len;
    bool cmp(node aa, node bb)
    {
        if (pos[aa.l] == pos[bb.l]) {
            return aa.r < bb.r;
        } else {
            return pos[aa.l] < pos[bb.l];
        }
    }
    int col[maxn];
    int flag[maxn];
    void add(int x)
    {
        if (flag[col[x]]++ == 0) {
            Ans++;
        }
    }
    void del(int x)
    {
        if (--flag[col[x]] == 0) {
            Ans--;
        }
    }
    int main()
    {
        //freopen("D:\code\text\input.txt","r",stdin);
        //freopen("D:\code\text\output.txt","w",stdout);
        gg(n); 
        len = (int)(sqrt(n));
        repd(i, 1, n) {
            gg(col[i]);
        }
        gg(m);
        repd(i, 1, m) {
            gg(a[i].l);
            gg(a[i].r);
            a[i].id = i;
            pos[i] = i / len;
        }
        sort(a + 1, a + 1 + m, cmp);
        repd(i, 1, m) {
            while (l > a[i].l) {
                l--;
                add(l);
            }
            while (r < a[i].r) {
                r++;
                add(r);
            }
            while (l < a[i].l) {
                del(l);
                l++;
            }
            while (r > a[i].r) {
                del(r);
                r--;
            }
            ans[a[i].id].fi = Ans;
        }
        repd(i, 1, m) {
            printf("%lld
    ", ans[i].fi);
        }
        return 0;
    }
    
    inline void getInt(int *p)
    {
        char ch;
        do {
            ch = getchar();
        } while (ch == ' ' || ch == '
    ');
        if (ch == '-') {
            *p = -(getchar() - '0');
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 - ch + '0';
            }
        } else {
            *p = ch - '0';
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 + ch - '0';
            }
        }
    }
    
    
    
    
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
    Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
    Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
    Civil 3D 二次开发 新建CLR项目出现错误C2143
    Civil 3D 二次开发 创建AutoCAD对象—— 00 ——
    了解AutoCAD对象层次结构 —— 6 ——块表记录
    datepicker97使用
    使用angular 外接 templateUrl,使用ng-include
    angularJs 遮罩
    网上找的有关css兼容问题
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11365133.html
Copyright © 2011-2022 走看看