제출 #1284168

#제출 시각아이디문제언어결과실행 시간메모리
1284168janson01093개의 봉우리 (IOI25_triples)C++20
70 / 100
126 ms18848 KiB
#include "triples.h"
#include <bits/stdc++.h>
#define F first
#define S second
#define lol ios::sync_with_stdio(false);cin.tie(NULL);
typedef long long ll;
typedef long double ld;
using namespace std;
const ll M = 998244353;

long long count_triples(std::vector<int> H) {
    int N = H.size();
    ll ans = 0;
    for(int i=0; i<N; i++) {
        int j = H[i] + i;
        if(i < j && j < N) {
            int k1 = H[j] + i, k2 = H[j] + j, k3 = j - H[j];
            if(i < k1 && k1 < N && H[k1] == abs(k1 - j)) ans++;
            if(j < k2 && k2 < N && H[k2] == k2 - i) ans++;
            if(i < k3 && k3 < j && H[k3] == k3 - i) ans++;
        }
    }
    for(int j=0; j<N; j++) {
        int i = j - H[j];
        if(0 <= i && i < j) {
            int k = H[i] + j;
            if(j < k && k < N && H[k] == k - i) ans++;
        }
    }
    map<int,vector<int>> mp;
    for(int i=0; i<N; i++) mp[H[i]-i].push_back(i);
    int d = sqrt(N);
    for(auto & p : mp) {
        if(p.S.size() <= d) {
            for(int x=0; x<p.S.size(); x++) for(int y=x+1; y<p.S.size(); y++) {
                int i=p.S[x], j = p.S[y], k = H[i] + j;
                if(j < k && k < N && H[k] == j-i) ans++;
            }
        } else {
            for(int k=0; k<N; k++) {
                int sm = k - p.F, df = H[k];
                if((sm - df) % 2 == 0) {
                    int i = (sm-df)/2, j = (sm+df)/2;
                    if(0 <= i && i < j && j < k && H[i]-i == p.F && H[j]-j == p.F) ans++;
                }
            }
        }
    }
    for(int i=0; i<N; i++) {
        int d1 = H[i], d2 = H[i]/2;
        if(i + 2*d1 < N && ((H[i+d1] == d1 && H[i+2*d1] == 2*d1) || (H[i+d1] == 2*d1 && H[i+2*d1] == d1))) ans--;
        if(H[i] % 2 == 0 && i + 2*d2 < N && H[i+d2] == d2 && H[i+2*d2] == d2) ans--;
    }
    return ans;
}

std::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...