제출 #1251486

#제출 시각아이디문제언어결과실행 시간메모리
1251486flashmt3개의 봉우리 (IOI25_triples)C++20
51 / 100
2099 ms79432 KiB
#include "triples.h"
#include <bits/stdc++.h>
#ifdef LOCAL
#include "Debug.h"
#else
#define debug(...) 42
#endif
using namespace std;

long long calc(vector<int> h)
{
  int n = size(h);
  vector<int> l(n), r(n);
  vector<set<int>> lAt(n * 3), rAt(n * 3);
  for (int i = 0; i < n; i++)
  {
    l[i] = i - h[i];
    lAt[l[i] + n].insert(h[i]);
    r[i] = i + h[i];
    rAt[r[i] + n].insert(h[i]);
  }

  long long res = 0;
  for (int i = 0; i < n; i++)
  {
    int j = r[i];
    if (j < n)
    {
      // 2.3..5
      res += r[j] < n && h[r[j]] == h[i] + h[j];

      // 2.5..3
      if (h[j] > h[i])
      {
        int k = j + h[j] - h[i];
        if (k < n && l[k] == j)
          res++;
      }

      // 5.3..2
      if (h[j] < h[i])
      {
        int k = i + h[j];
        if (r[k] == j && h[k] != h[j]) // exclude 211
          res++;
      }
    }

    // k.2..5.3..j
    int ll = l[i] + n, rr = r[i] + n, szL = size(lAt[ll]), szR = size(rAt[rr]);
    if (szL < szR)
    {
      for (int u : lAt[ll])
        if (u * 2 != h[i])
          res += rAt[rr].count(h[i] - u);
    }
    else
    {
      for (int u : rAt[rr])
        if (u * 2 != h[i])
          res += lAt[ll].count(h[i] - u);
    }
  }

  for (int i = 0; i < n; i++)
  {
    int j = l[i];
    if (j < 0)
      continue;

    // 5.2..3
    if (l[j] >= 0 && h[l[j]] == h[i] + h[j])
      res++;

    // 3.2..5
    int k = i + h[j];
    if (r[j] != i && k < n && h[k] == h[i] + h[j]) // exclude 112
      res++;
  }

  return res;
}

long long count_triples(vector<int> h) {
  return calc(h);
}

vector<int> construct_range(int M, int K) {
  return {1, 1, 1};
}
#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...