Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int kMaxN = 500005;
- long long answer = 0;
- int A[kMaxN];
- int I[kMaxN], Max[kMaxN], Norm[kMaxN];
- int T[kMaxN], Val[kMaxN];
- bool bit;
- int n;
- void Add(int pos, int d) {
- for(; pos; pos -= (pos & -pos))
- T[pos] += d;
- }
- int Query(int pos) {
- int s = 0;
- for(; pos <= n; pos += (pos & -pos))
- s += T[pos];
- return s;
- }
- void Count(int b1, int e1, int b2, int e2, bool bit) {
- sort(I + b2, I + e2, [](int a, int b) {
- return 1LL * Val[Max[a]] * A[b] > 1LL * Val[Max[b]] * A[a];
- });
- sort(I + b1, I + e1, [](int a, int b) {
- return A[a] > A[b];
- });
- int j = b2;
- for(int i = b1; i < e1; ++i) {
- int ind_left = I[i];
- while(j < e2) {
- int ind_right = I[j];
- if(1LL * A[ind_left] * A[ind_right] <= Val[Max[ind_right]]) {
- Add(Max[ind_right], 1);
- ++j;
- }
- else break;
- }
- int now = Query(Max[ind_left] + bit);
- answer += now;
- }
- for(int i = b2; i < j; ++i)
- Add(Max[I[i]], -1);
- }
- void Solve(int l, int r) {
- if(l + 1 >= r) return;
- int m = (l + r) / 2;
- Solve(l, m);
- Solve(m, r);
- for(int i = m; i < r; ++i) {
- Max[i] = Norm[i];
- if(i > m) Max[i] = max(Max[i], Max[i - 1]);
- }
- for(int i = m - 1; i >= l; --i) {
- Max[i] = Norm[i];
- if(i < m - 1) Max[i] = max(Max[i], Max[i + 1]);
- }
- Count(l, m, m, r, 0);
- Count(m, r, l, m, 1);
- }
- void Read(int &a) {
- char c;
- for(c = getchar(); !isdigit(c); c = getchar());
- for(a = 0; isdigit(c); c = getchar())
- a = (a << 1) + (a << 3) + c - '0';
- }
- int main() {
- Read(n);
- map<int, int> Map;
- for(int i = 0; i < n; ++i) {
- Read(A[i]);
- Map[A[i]] += 1;
- }
- int cnt = 0;
- for(auto &p : Map) {
- p.second = ++cnt;
- Val[cnt] = p.first;
- }
- for(int i = 0; i < n; ++i) {
- Norm[i] = Map[A[i]];
- I[i] = i;
- }
- Solve(0, n);
- cout << answer << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement