제출 #1261962

#제출 시각아이디문제언어결과실행 시간메모리
1261962Canuc80k3개의 봉우리 (IOI25_triples)C++20
34 / 100
2094 ms2628 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;

ll res = 0;
vector<int> H;

void add(ll i, ll j, ll k) {
    res ++;
}

long long count_triples(std::vector<int> H) {
    ::H = H;
    // #TH: a[k] max
    for (int k = 2; k < H.size(); k ++) {
        int i = k - H[k]; if (i < 0 || H[i] >= H[k]) continue; int j1 = k - H[i], j2 = i + H[i];
        if (j1 < 0 || H[j1] >= H[k] || H[j1] != j1 - i) j1 = -1;
        if (j2 >= k || H[j2] >= H[k] || H[j2] != k - j2) j2 = -1;
        if (j1 != -1) add(i, j1, k); if (j2 != -1 && j1 != j2) add(i, j2, k);
    }
    cerr << "A[k] max: " << res << endl;

    // #TH: a[i] max
    for (int i = 0; i + 2 < H.size(); i ++) {
        int k = i + H[i]; if (k >= H.size() || H[k] >= H[i]) continue; int j1 = k - H[k], j2 = i + H[k];
        if (j1 < 0 || H[j1] >= H[i] || H[j1] != j1 - i) j1 = -1;
        if (j2 >= k || H[j2] >= H[i] || H[j2] != k - j2) j2 = -1;
        if (j1 != -1) add(i, j1, k); if (j2 != -1 && j1 != j2) add(i, j2, k);
    }
    cerr << "A[i] max: " << res << endl;
    
    // #TH: a[j] max, j - i = a[i]
    for (int i = 0; i + 2 < H.size(); i ++) {
        int j = i + H[i]; if (j >= H.size() || H[j] <= H[i]) continue; int k = i + H[j];
        if (k >= H.size() || H[k] >= H[j] || k - H[k] != j || k - j == H[i]) k = -1;
        if (k != -1) add(i, j, k);
    }
    cerr << "A[j] max, j - i = a[i]: " << res << endl;

    // #TH: a[j] max, j - i = a[k] && j - i != a[i]
    // if (0)
    for (int i = 0; i + 2 < H.size(); i ++) {
        for (int k = i + 2; k < H.size(); k ++) {
            int j = i + H[k]; if (j != k - H[i] || j >= H.size()) continue;
            if (H[i] >= H[j] || H[j] <= H[k] || k - i != H[j] || j >= k) continue;
            add(i, j, k);
        }
    }
    cerr << "A[j] max, j - i = a[k] && j - i != a[i]: " << res << endl;
    return res;
}

std::vector<int> construct_range(int M, int K) {
    // vector<int> res; res.push_back(1);
    // for (int i = 1; i < M; i ++) res.push_back(i);
    // return res;
}

컴파일 시 표준 에러 (stderr) 메시지

triples.cpp: In function 'std::vector<int> construct_range(int, int)':
triples.cpp:59:1: warning: no return statement in function returning non-void [-Wreturn-type]
   59 | }
      | ^
#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...