题解 | #循环队列#
循环序列
https://ac.nowcoder.com/acm/contest/79000/E
题目解释
这道题说白了就是给一个区间,在一个循环队列中寻找一个特定的数字,并将些相同的数字对应的下标两两组合,问一共有多少对。
思路
循环队列的处理
直接将数列中循环的部分往后依次填即可
for(int i = n + 1 ; i <= N ; i++)
arr[i] = arr[i - n];
相同数字的查找和配对
对于查找,我们直接用哈希表存数字和此区间中数字出现的次数。遍历结束后,find函数查找即可
对于配对,我们自然可以想到组合数学,由于没有数组下标顺序之分,就直接在数字出现的次数n中选2个数:
code
#include <iostream>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int N = 1000010;
int arr[N];
int main()
{
int n, q;
cin >> n >> q;
for(int i = 1 ; i <= n ; i++)
cin >> arr[i];
for(int i = n + 1 ; i <= N ; i++)
arr[i] = arr[i - n];
unordered_map<int, ll> hash;
for(int i = 0 ; i < q ; i++)
{
int l, r, x;
cin >> l >> r >> x;
for(int i = l ; i <= r ; i++)
hash[arr[i]]++;
auto it = hash.find(x);
if(it != hash.end())
cout << (it->second * (it->second - 1)) / 2 << endl; //找到,进行计算
else
cout << 0 << endl; //没有找到数字返回0
hash.clear(); // 记得要将哈希表清空
}
return 0;
}