제출 #1250581

#제출 시각아이디문제언어결과실행 시간메모리
1250581s4dz3개의 봉우리 (IOI25_triples)C++20
8 / 100
2096 ms14264 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
//sub4:
#define int long long
std::vector<int> construct_range(signed M, signed K)
{
    return{};
}
/*long long count_triples(vector<int> H)
{
    int n = H.size();
    ll ans = 0;
    for (int k = 0; k < n; k++)
    {
        int c = H[k];
        int i = k - c;
        if (i < 0 || i >= n) continue;

        int a = H[i];
        if (a > c - a) continue;

        int need = c - a;
        int j1   = i + a;
        int j2   = k - a;
        if (i < j1 && j1 < k && H[j1] == need) ans++;
        if (j2 != j1 && i < j2 && j2 < k && H[j2] == need) ans++;
    }
    return ans;
}*/

long long count_triples(vector<signed> H)
{
    int n = H.size();
    long long ans = 0;
    for (int i = 0; i < n; i++)
    {
        int k = i + H[i];
        if (k >= n) continue;
        int d = H[k];
        int j1 = i + d;
        int j2 = k - d;
        if (j1 == j2)
        {
            if (i < j1 && j1 < k)
            {
                if (H[j1] == k - j1) ans++;
            }
        }
        else
        {
            if (i < j1 && j1 < k)
            {
                if (H[j1] == k - j1) ans++;
            }
            if (i < j2 && j2 < k)
            {
                if (H[j2] == j2 - i) ans++;
            }
        }
    }
    for (int k = 0; k < n; k++)
    {
        int i = k - H[k];
        int d = H[i];
        int j1 = i + d;
        int j2 = k - d;
        if (j1 == j2)
        {
            if (i < j1 && j1 < k)
            {
                if (H[j1] == k - j1) ans++;
            }
        }
        else
        {
            if (i < j1 && j1 < k)
            {
                if (H[j1] == k - j1) ans++;
            }
            if (i < j2 && j2 < k)
            {
                if (H[j2] == j2 - i) ans++;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        int j = i + H[i];
        if (j >= n) continue;
        int k = i + H[j];
        if (k >= n) continue;
        if (k > j && H[k] == k - j) ans++;
    }

    unordered_map<int, vector<int>> nhom;
    for (int i = 0; i < n; i++)
    {
        int x = H[i] - i;
        nhom[x].push_back(i);
    }

    for (auto &p : nhom)
    {
        int x = p.first;
        vector<int> A = p.second;
        sort(A.begin(), A.end());
        for (int u = 0; u < A.size(); u++)
        {
            int i = A[u];
            for (int v = u + 1; v < A.size(); v++)
            {
                int j = A[v];
                int k = i + j + x;
                if (k >= n) break;
                if (H[i] == j - i) continue;
                if (H[k] == j - i) ans++;
            }
        }
    }
    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...