제출 #1328090

#제출 시각아이디문제언어결과실행 시간메모리
1328090Numberz3개의 봉우리 (IOI25_triples)C++20
75.29 / 100
261 ms33808 KiB
#include "triples.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>

const int MAXN = 4e5+5;
vector<int> diag1[MAXN], diag2[MAXN];
int d1[MAXN], d2[MAXN];

ll count_triples(vector<int> H) {
  
  int n = H.size();
  set<array<int, 3>> trips;
  //count standard pairs
  for (int i = 0; i < n; i++) {
    for (int j : {i - H[i], i + H[i]}) if (j >= 0 && j < n) {
      for (int k : {i + H[i], i - H[i], i + H[j], i - H[j], j + H[i], j - H[i], j + H[j], j - H[j]}) if (k >= 0 && k < n) {
        array<int, 3> diffs = {abs(i-j), abs(i-k), abs(k-j)};
        array<int, 3> hs = {H[i], H[j], H[k]};
        sort(diffs.begin(), diffs.end());
        sort(hs.begin(), hs.end());
        if (hs == diffs) {
          array<int, 3> ind = {i, j, k};
          sort(ind.begin(), ind.end());
          trips.insert(ind);
        }
      }
    }
  }

  ll ans = trips.size();

  for (int i = 0; i < n; i++) {
    ll d = H[i] - i + n;
    d1[i] = diag1[d].size();
    diag1[d].push_back(i);
  }
  for (int i = n-1; i >= 0; i--) {
    ll d = H[i] + i;
    d2[i] = diag2[d].size();
    diag2[d].push_back(i);
  }

  for (int j = 0; j < n; j++) {
    if (d1[j] < d2[j]) {
      int d = H[j] - j + n;
      for (int x = 0; x < d1[j]; x++) {
        int i = diag1[d][x];
        int k = i + H[j];
        if (k < n && (H[k] + k == H[j] + j)) if (H[i] != H[j] && H[j] != H[k] && H[k] != H[i]) ans++;
      }
    } else {
      int d = H[j] + j;
      for (int x = 0; x < d2[j]; x++) {
        int k = diag2[d][x];
        int i = k - H[j];
        if (i >= 0 && (H[i] - i == H[j] - j)) if (H[i] != H[j] && H[j] != H[k] && H[k] != H[i]) ans++;
      }
    }
  }

  return ans;

}

std::vector<int> construct_range(int M, int K) {
  vector<int> ans = {1};
  for (int i = 1; i < M; i++) ans.push_back(i);
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...