0%

CF-1079-D. Another Problem about Beautiful Pairs

题目大意

在数组 aa 中,如果满足以下条件,我们称索引对 ii, jj 为美丽的:

  • aiaj=jia_{i} \cdot a_{j} = j - i

统计数组 aa 中美丽对的数量。

思路讲解

使用比较聪明的暴力去枚举这个点,对呀。去枚枚举 X 和 Y 那么枚举 X Y 其实它是 N log N 的,实际上是。这应该也是一个经典结论了,可以使用调和级数证明,应该是。枚举 X 和 Y 以后呢,实际上就非常简单了。就是因为我们已经枚举出来,枚举出来以后,我们只需要验证一下这个数组当中有没有这样子的 X 和 Y 。我们可以选择去遍历 X 所有的位置,然后遍历到 X 位置 以后我们直接去检验应该有 Y 的那个地方是不是一个 Y 如果是 Y 的话,我们就给这个答案加一。

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
void Solve() {
ll N;
cin >> N;
vector<ll> A(N+2);
for (int i=1;i<=N;++i) {
cin>>A[i];
}
vector<vector<ll>> val_pos_mtx(N+2);
for (int i=1;i<=N;++i) {
if (A[i]<=N) {
val_pos_mtx[A[i]].push_back(i);
}
}
ll ans=0;
for (ll x=1;x<=N;++x) {
if (val_pos_mtx[x].empty()) continue;
for (ll y=1;y<=N/x;++y) {
if (val_pos_mtx[y].empty()) continue;
ll mul=x*y;
for (auto i:val_pos_mtx[x]) {
ll j=i+mul;
if (j<=N && A[j]==y) {
++ans;
}
}
}
}
cout<<ans<<"\n";
}

AC代码

AC

https://codeforces.com/contest/2197/submission/362477014

心路历程(WA,TLE,MLE……)