2015-08-08 22:06:48
【传送门】
赛后补的一场
A、B题水。
C题,只要正着、反着扫一遍,再统计答案就可以了。
#include <cstdio> #include <ctime> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2) #define MP(a,b) make_pair(a,b) #define PB push_back typedef long long ll; typedef pair<int,int> pii; const double eps = 1e-8; const int INF = (1 << 30) - 1; const int MAXN = 200010; int n,k; ll A[MAXN]; int L[MAXN],R[MAXN]; map<ll,int> mp; int main(){ scanf("%d%d",&n,&k); for(int i = 1; i <= n; ++i){ int a; scanf("%d",&a); A[i] = (ll)a; } for(int i = 1; i <= n; ++i){ if(A[i] % k == 0){ L[i] = mp[A[i] / k]; } mp[A[i]]++; } mp.clear(); for(int i = n; i >= 1; --i){ R[i] = mp[A[i] * k]; mp[A[i]]++; } ll ans = 0; for(int i = 1; i <= n; ++i){ ans += (ll)L[i] * R[i]; } printf("%I64d\n",ans); return 0; }