Submission #1259706

#TimeUsernameProblemLanguageResultExecution timeMemory
1259706rxlfd314Triple Peaks (IOI25_triples)C++20
72.65 / 100
437 ms31304 KiB
#include "triples.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ari2 = array<int, 2>;
using ari3 = array<int, 3>;
using arl2 = array<ll, 2>;
using arl3 = array<ll, 3>;
template <class T> using vt = vector<T>;
#define all(x) begin(x), end(x)
#define size(x) (int((x).size()))
#define REP(a,b,c,d) for(int a=(b);(d)>0?a<=(c):a>=(c);a+=(d))
#define FOR(a,b,c) REP(a,b,c,1)
#define ROF(a,b,c) REP(a,b,c,-1)

ll count_triples(vt<int> H) {
	const int N = size(H);
	ll ans = 0;
  set<ari3> s;
  const auto check = [&](const int i, const int j, const int k, bool bruh) {
    if (!(i < j && j < k && i >= 0 && k < N))
      return false;
    ari3 a = {j - i, k - i, k - j};
    ari3 b = {H[i], H[j], H[k]};
    sort(all(a));
    sort(all(b));
    if (a == b && bruh)
      s.insert({i, j, k});
    return a == b;
  };
  FOR(i, 1, N-2) {
    s.clear();
    if (i-H[i] >= 0) {
      check(i-H[i], i, i+H[i-H[i]], 1);
      check(i-H[i], i, i-H[i]+H[i-H[i]], 1);
    }
    if (i+H[i] < N) {
      check(i-H[i+H[i]], i, i+H[i], 1);
      check(i+H[i]-H[i+H[i]], i, i+H[i], 1);
    }
    ans += size(s);
  }
  FOR(i, 0, N-3) {
    const int j = i + H[i];
    if (j < N-1 && H[j] > H[i]) {
      const int k = i + H[j];
      ans += check(i, j, k, 0) && H[i] != H[k];
    }
  }
  // a < b < c
  // max(H[a], H[c]) < H[b]
  // b - a = H[c]
  // c - b = H[a]
  // c - a = H[b]
  // c - a = H[c] + H[a]
  // a + H[a] = c - H[c]
  // b - a + H[b] = H[c] + c - a
  // b + H[b] = c + H[c]
  // b - c - H[b] = -H[a] - c + a
  // b - H[b] = a - H[a]
  vt<vt<int>> d1(N<<1), d2(N<<1);
  FOR(i, 0, N-1) {
    d1[i-H[i]+N].push_back(i);
    d2[i+H[i]].push_back(i);
  }
  FOR(b, 1, N-2) {
    if (size(d1[b-H[b]+N]) < size(d2[b+H[b]]))
      for (const auto &a : d1[b-H[b]+N])
        ans += check(a, b, b + H[a], 0);
    else
      for (const auto &c : d2[b+H[b]])
        ans += check(b - H[c], b, c, 0);
  }
  return ans;
}

vt<int> construct_range(int M, int K) {
  vt<int> ret(M);
  FOR(i, 0, M-1)
    ret[i] = i % 2 + 1;
  return ret;
}
#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...