题目大意
在数组 a a a 中,如果满足以下条件,我们称索引对 i i i , j j j 为美丽的:
a i ⋅ a j = j − i a_{i} \cdot a_{j} = j - i a i ⋅ a j = j − i 。
统计数组 a a a 中美丽对的数量。
思路讲解
使用比较聪明的暴力去枚举这个点,对呀。去枚枚举 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
源代码
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 #include <bits/stdc++.h> #define all(vec) vec.begin(),vec.end() #define lson(o) (o<<1) #define rson(o) (o<<1|1) #define SZ(a) ((long long) a.size()) #define debug(var) cerr << #var <<" = [" <<var<<"]" <<"\n" ; #define debug1d(a) \ cerr << #a << " = [" ; \ for (int i = 0; i < (int)(a).size(); i++) \ cerr << (i ? ", " : "" ) << a[i]; \ cerr << "]\n" ; #define debug2d(a) \ cerr << #a << " = [\n" ; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [" ; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ cerr << (j ? ", " : "" ) << a[i][j]; \ cerr << "]\n" ; \ } \ cerr << "]\n" ; #define debug3d(a) \ cerr << #a << " = [\n" ; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [\n" ; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ { \ cerr << " [" ; \ for (int k = 0; k < (int)(a[i][j]).size(); k++) \ cerr << (k ? ", " : "" ) << a[i][j][k]; \ cerr << "]\n" ; \ } \ cerr << " ]\n" ; \ } \ cerr << "]\n" ; #define cend cerr<<"\n-----------\n" #define fsp(x) fixed<<setprecision(x) using namespace std;using ll = long long ;using ull = unsigned long long ;using DB = double ;using CD = complex<double >;static constexpr ll MAXN = (ll)1e6 +10 , INF = (1ll <<61 )-1 ;static constexpr ll mod = 998244353 ; static constexpr double eps = 1e-8 ;const double pi = acos (-1.0 );ll lT,testcase; 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" ; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); #ifdef LOCAL cout.setf (ios::unitbuf); #endif cin >> lT; for (testcase=1 ;testcase<=lT;++testcase) Solve (); return 0 ; }
心路历程(WA,TLE,MLE……)