因此,我们得到了数字{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;
}
}
}