正经题解|音乐先辈Yuilice
2024-03-22 13:43:03
发布于:浙江
9阅读
0回复
0点赞
题目大意
根据序列中的得到记为,再找对应的,得到记为,如果=,则认为找到了一组答案。
题目思路
- 读入每个样例的乐谱数据数量 。
- 使用
map
存储每个地址 的出现次数。 - 遍历
map
,对于每个地址 ,如果其出现次数大于等于2,计算能够组成的按键地址数量并累加。这个循环遍历map
中的每个元素(即每个不同的及其出现次数)。如果某个 出现了至少两次(i.second >= 2)
,那么它可以与自己组合成完整的地址。组合数可以通过组合公式C(n, 2) = n(n-1) / 2
计算,即从这些重复的 中选择两个不同的进行组合。 - 特殊情况。对于 = 和 = ,它们对应的地址 = = 和 = = 满足$ A^B$ = 。因此,如果输入中有 和 ,那么它们之间可以相互配对。配对的总数是它们出现次数的乘积。
- 输出最终的按键地址数量。
算法核心思想是通过 map
存储地址 的出现次数,然后遍历 map
计算满足条件的按键地址数量。最后输出结果。
时间复杂度分析
该算法的时间复杂度主要取决于遍历和统计 map
的操作,因此是 的复杂度。
代码演示
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin >> n;
map<long long,long long>mp;
for(int i = 1 ; i <= n ; i ++ )
{
int x;
cin >> x;
mp[x]++;
}
long long count = 0 ;
for(auto i : mp)
{
if(i.second >= 2)count += (i.second - 1) * i.second / 2;
}
if(mp[1] >= 1 && mp[2] >= 1)count += mp[1] * mp[2];
cout << count << endl;
}
int main()
{
int t;
cin >> t;
while(t--)
{
solve();
}
return 0;
}
这里空空如也
有帮助,赞一个