2023河南萌新联赛第(五)场:郑州轻工业大学 I 双指针
原创 于 2023-08-10 20:50:09 发布 · 粉丝可见 · 121 阅读 · 0 · 0 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/132217792
题目:


思路:
这里我们可以把公式ai* aj = bi * bj 转换成 ai / bi = bj / ai
这样就可以顺着序号来找答案,统计好对应的计算结果,最后累加,去除我们重复部分即可
代码详解如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream> #include <vector> #include <unordered_map> #define endl '\n' #define int long long #define umap unordered_map #define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0) using namespace std;
inline void solve() { int n = 0; umap<double, int>r;
vector<int>a, b;
cin >> n;
for (int i = 0, x; i < n; ++i) { cin >> x; a.emplace_back(x); } for (int i = 0, x; i < n; ++i) { cin >> x; b.emplace_back(x); }
for (int i = 0; i < n; ++i) { r[1.0 * a[i] / b[i]]++; }
int ans = 0;
for (int i = 0; i < n; ++i) { double tem = 1.0 * b[i] / a[i];
if (1.0 * b[i] / a[i] == 1.0 * a[i] / b[i]) ans--;
ans += r[1.0 * b[i] / a[i]]; }
cout << ans / 2 << endl;
return ; }
signed main() { ___G; int _t; cin >> _t; while (_t--) { solve(); }
return 0; }
|
最后提交:
