제출 #1346469

#제출 시각아이디문제언어결과실행 시간메모리
1346469pandaa733개의 봉우리 (IOI25_triples)C++20
0 / 100
17 ms1860 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff endl
#define lf "\n"
#define fi first
#define se second
#define _ << ' ' <<
#define all(x) begin(x),end(x)
#define rall(x) rbegin(x),rend(x)

#ifdef DEBUG

constexpr bool IS_DEBUG = 1;

#define infor(fmt, ...) do { print(stderr, fmt, ##__VA_ARGS__); } while(0)
#define infof(fmt, ...) do { println(stderr, fmt, ##__VA_ARGS__); } while(0)

#else

constexpr bool IS_DEBUG = 0;

#define infor(fmt, ...)
#define infof(fmt, ...)

#endif

using ll = long long;

using pll = pair<ll, ll>;
using pii = pair<int, int>;

template<typename... Args>
using vec = vector<Args...>;

constexpr int LOG = 20;
constexpr int MOD = 1e9+7;
constexpr int MAXN = 1e5+7;

mt19937 timmy_loves_gambling(73);

long long count_triples(vector<int> H) {
    const int N = H.size();

    ll ans = 0;
    auto check_triple = [&](int i, int j, int k) -> bool {
        if(i < 0 || i >= N) return 0;
        if(j < 0 || j >= N) return 0;
        if(k < 0 || k >= N) return 0;
        if(i >= j || j >= k) return 0;

        vec<int> d = {j - i, k - j, k - i};
        vec<int> h = {H[i], H[j], H[k]};

        sort(all(d));
        sort(all(h));

        bool ok = d == h;

        infof("... check_triple({}, {}, {}) -> {}", i, j, k, (int)ok);
        return ok;
    };

    auto strip = [&](vec<int> &V) -> void {
        sort(all(V));
        V.resize(unique(all(V)) - V.begin());
    };

    for(int i = 0; i < N; ++i) {
        int k = i + H[i];

        if(k < 0 || k >= N) continue;

        vec<int> J = {H[k] + i, k - H[k]};

        strip(J);
        for(auto j: J) {
            ans += check_triple(i, j, k);
        }
    }

    for(int i = 0; i < N; ++i) {
        int j = i + H[i];

        if(j < 0 || j >= N) continue;

        ans += check_triple(i, j, i + H[j]);
    }

    for(int j = 0; j < N; ++j) {
        int i = j - H[j];

        if(i < 0 || i >= N) continue;

        ans += check_triple(i, j, j + H[i]);
    }

    return ans;
}

vector<int> construct_range(int M, int K) {
    assert(0 && "construct_range: unimplemented");
}

#ifdef LOCAL
namespace {

void run_part1() {
  int N;
  assert(1 == scanf("%d", &N));
  std::vector<int> H(N);
  for (int i = 0; i < N; i++)
    assert(1 == scanf("%d", &H[i]));
  fclose(stdin);

  long long T = count_triples(H);

  printf("%lld\n", T);
  fclose(stdout);
}

void run_part2() {
  int M, K;
  assert(2 == scanf("%d %d", &M, &K));
  fclose(stdin);

  std::vector<int> H = construct_range(M, K);

  int N = H.size();
  printf("%d\n", N);
  for (int i = 0; i < N; i++)
    printf("%d%c", H[i], " \n"[i + 1 == N]);
  fclose(stdout);
}

} // namespace

int main() {
  int part;
  assert(1 == scanf("%d", &part));
  if (part == 1)
    run_part1();
  else if (part == 2)
    run_part2();

  return 0;
}
#endif
#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...