1

配列 (ソートされていない) といくつかの範囲クエリが与えられます。クエリごとに、指定された範囲内の一意の桁数を見つける必要があります。これが私が思いついた素朴なアプローチです。

#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
    int n; scanf("%d",&n); //Size of the array
    int a[n+1]; a[0]=0;

    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);

    int q; scanf("%d",&q); //Number of queries

    while(q--)
    {
        int x,y; scanf("%d %d",&x,&y); //Range of each query
        int bit[n+1];
        for(int i=0;i<=n;i++)
            bit[i]=0;

        for(int i=1;i<=n;i++)
        {
            for(int j=i-1;j>0;j--)
            {
                bit[i]=a[i];
                if(bit[j]==a[i])
                {
                    bit[j]=0;
                    break;
                }
            }
        }
        int cnt=0;
        for(int i=x;i<=y;i++)
        {
            if(bit[i])
                cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;

}

この操作を行う最も効率的な方法は何ですか? これは Binary Indexed ツリーを使用して実行できると思いますが、解決策を思い付くことができませんでした。

4

1 に答える 1

0

範囲クエリの数が配列のサイズに比べて少ない場合、たとえば O(k) 対 O(n) で k << n の場合、次のようになります。

  1. すべての範囲エンドポイントを平衡二分木 O(klogk) に入れる
  2. 配列を 1 回パスし、各サブ範囲内の一意の要素をカウントします。ハッシュ テーブルを使用して、既に見た要素を覚えておいてください。の上)
  3. 各範囲クエリの範囲エンドポイント間で順番にトラバーサルを実行し、サブ範囲の合計を合計します。O(k^2) 最悪の場合 / O(klogk) 妥当なクエリの場合。
于 2015-01-17T11:32:30.563 に答える