Submission #1288036

#TimeUsernameProblemLanguageResultExecution timeMemory
1288036nikoloz-ch3개의 봉우리 (IOI25_triples)C++20
19.86 / 100
2107 ms397776 KiB
#include <bits/stdc++.h>
using namespace std;

multiset<tuple<int,int,int>> ss;

void ins(int a, int b, int c){
    ss.insert({a,b,c});
    ss.insert({b,a,c});
    ss.insert({b,c,a});
    ss.insert({c,a,b});
    ss.insert({a,c,b});
    ss.insert({c,b,a});
}

long long count_triples(std::vector<int> H){
    int N = H.size(), ans = 0;
    if(N <= 5000){
        map<int,vector<int>> mp;
        for(int i = 0; i < N; i++){
            mp[i-H[i]].push_back(i);
        }
        for(int i = 0; i < N; i++){
            for(int j = i+1; j < N; j++){
                const int k = j-i;
                if(k != H[i] and k != H[j]){
                    if(k != abs(H[i]-H[j])) continue;
                    const int p = j+min(H[i],H[j]);
                    if(p >= N or H[p] != k or p <= j) continue;
                    ans++; ins(i,j,p);
                    continue;
                }
                if(k == H[i]){
                    for(auto &t : mp[i]){
                        if(t <= j) continue;
                        if(t-j != H[j]) continue;
                        ans++; ins(i,j,t);
                    }
                    for(auto &t : mp[j]){
                        if(t <= j) continue;
                        if(t-i != H[j]) continue;
                        ans++; ins(i,j,t);
                    }
                    continue;
                }
                for(auto &t : mp[i]){
                    if(t <= j) continue;
                    if(abs(t-j) != H[i]) continue;
                    ans++; ins(i,j,t);
                }
                for(auto &t : mp[j]){
                    if(t <= j) continue;
                    if(abs(t-i) != H[i]) continue;
                    ans++; ins(i,j,t);
                }
                continue;
            }
        }
        return ans;
    }
    for(int i = 0; i < N-20; i++){
        vector<int> a;
        for(int j = i; j < i+20; j++){
            a.push_back(H[j]);
        }
        int p = count_triples(a);
    }
    return ss.size();
}


std::vector<int> construct_range(int M, int K){
    vector<int> a = {4, 1, 4, 3, 2, 6, 4, 1, 4, 3, 2, 6, 4, 1, 4, 3, 2, 6, 1, 2};
    if(M == 20) return a;
    if(M == 500){
        for(int i = 0; i < 24; i++){
            auto op = a;
            for(int j = 0; j < 20; j++) a.push_back(op[j]);
        }
        return a;
    }
    if(M == 5000){
        for(int i = 0; i < 245; i++){
            auto op = a;
            for(int j = 0; j < 20; j++) a.push_back(op[j]);
        }
        return a;
    }
    if(M == 30000){
        for(int i = 0; i < 1200; i++){
            auto op = a;
            for(int j = 0; j < 20; j++) a.push_back(op[j]);
        }
        return a;
    }
}

Compilation message (stderr)

triples.cpp: In function 'std::vector<int> construct_range(int, int)':
triples.cpp:95:1: warning: control reaches end of non-void function [-Wreturn-type]
   95 | }
      | ^
#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...