題目連接:https://codeforces.com/problemset/problem/567/Cios
題意:c++
給出長度爲 $n$ 的序列 $a[1:n]$,給出公比 $k$,要求你個給出該序列中,長度爲 $3$ 的等比子序列的數目。spa
題解:code
首先倒着遍歷,用map記錄曾經出現過的每一個數字的出現次數,而後再用另外一個map來記錄曾經出現過的全部知足 $(x,kx)$ 的二元組的數目,最後就直接維護答案便可。blog
AC代碼:ci
#include<bits/stdc++.h> #define IO (ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)) #define mk make_pair #define fi first #define se second using namespace std; typedef long long ll; typedef pair<ll,ll> P; const int maxn=2e5+10; int n; ll k,a[maxn]; map<ll,ll> mp1; map<P,ll> mp2; int main() { IO; cin>>n>>k; ll mx=-1e10, mn=1e10; for(int i=1;i<=n;i++) cin>>a[i], mx=max(a[i],mx), mn=min(a[i],mn); ll ans=0; for(int i=n;i>=1;i--) { if(mn/(k*k)<=a[i] && a[i]<=mx/(k*k)) ans+=mp2[mk(a[i]*k,a[i]*k*k)]; if(mn/k<=a[i] && a[i]<=mx/k) mp2[mk(a[i],a[i]*k)]+=mp1[a[i]*k]; mp1[a[i]]++; } cout<<ans<<endl; }