题解 | #循环队列#

循环序列

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;
}
全部评论

相关推荐

算法丰川祥:实际就两个人给他投,它这么说好显得自己比较抢手
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务