排列查询1 ... N

时间:2019-12-22 15:02:09

标签: algorithm

因此,我们得到了数字{1 ... N}的排列。 给我们一个整数k,然后再给该类型的k个查询:

q(x,y,l,r)-计算置换中位置X和Y之间的数字,即> = l和<= r。

例如: N-7:(1 6 3 5 7 4 2)

q(1,4,2,7)-> 3个数字( 6、3和5 ,因为2 <= 6 <= 7,2 <= 3 <= 7和2 <= 5 <= 7)

所以我的尝试是存储排列和位置数组(太快地访问每个数字的位置) 然后,我检查哪个间隔较小[x,y]或[l,r],然后遍历较小的间隔。 我得到的答案是正确的,但是我得到0分,因为我的解决方案太慢了。 有关如何针对大N尽可能快地执行此查询的任何提示?

        #include <iostream>

using namespace std;



int main()
{
    int n;
    cin >> n;
    int q;
    cin >> q;
    int* perm = new int[n+1];

    int* pos = new int[n+1];
    for (int i = 1; i <= n; i++)
    {
        int num;
        cin >> num;
        perm[i] = num;
        pos[num] = i;
    }

    for (int i = 0; i < q; i++)
    {
        int x, y, l, r;
        cin >> x >>y>> l>> r;
        int count = 0;
        if (y - x < r - l)
        {
            for (int i = x; i <= y; i++)
            {
                if (perm[i] >= l && perm[i] <= r)
                    count++;
            }
            cout << count << endl;
        }
        else
        {
            int count = 0;
            for (int i = l; i <= r; i++)
            {
                if (pos[i] >= x && pos[i] <= y)
                    count++;
            }
            cout << count << endl;
        }

    }
}


0 个答案:

没有答案
相关问题