제출 #1249797

#제출 시각아이디문제언어결과실행 시간메모리
1249797QwertyPi3개의 봉우리 (IOI25_triples)C++20
19.65 / 100
1567 ms15940 KiB
#include "triples.h"
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N_MAX = 2e5 + 11;
int N;
int H[N_MAX];

bool in(int x) {
    return 0 <= x && x < N;
}

bool check(int a, int b, int c) {
    if (!in(a) || !in(b) || !in(c) || a >= b || b >= c) return false;
    return multiset<int>{H[a], H[b], H[c]} == multiset<int>{abs(a - b), abs(a - c), abs(b - c)};
}

int ans = 0;
set<tuple<int, int, int>> S;

bool check_set(int a, int b, int c) {
    // cout << a << ' ' << b << ' ' << c << endl;
    bool ok = check(a, b, c);
    if (!ok) return false;
    if (S.count({a, b, c})) return false;
    S.insert({a, b, c}); ans++; return true;
}

int count_triples(vector<int32_t> H) {
    N = H.size();
    for (int i = 0; i < N; i++) ::H[i] = H[i];

    for (int i = 0; i < N; i++) {
        int a = i;
        {
            int b = a - H[a];
            if (in(b)) {
                int c = b + H[b];
                check_set(b, a, c);
            }
            if (in(b)) {
                int c = a + H[b];
                check_set(b, a, c);
            }
        }

        {
            int b = a + H[a];
            if (in(b)) {
                int c = b - H[b];
                check_set(c, a, b);
            }
            if (in(b)) {
                int c = a - H[b];
                check_set(c, a, b);
            }
        }
    }

    for (int a = 0; a < N; a++) {
        for (int c = a + 2; c < a + 30; c++) {
            check_set(a, a + H[a], c);
            check_set(a, a + H[c], c);
        }
    }
    return ans;
}

vector<int32_t> construct_range(int32_t M, int32_t _K) {
    if (M % 4 == 0) --M;
    int A = M / 2; if (A % 2 == 0) A--;
    int B = M - A;
    
    vector<int32_t> ans(M);
    for (int i = 0; i < B / 2; i++) {
        ans[i] = ans[M - 1 - i] = (A + 1) / 2 + (B / 2 - 1) - i;
    }
    for (int i = M / 2 - A / 2; i <= M / 2 + A / 2; i++) {
        ans[i] = (A + 1) + abs(i - (M / 2));
    }
    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...