Submission #1250552

#TimeUsernameProblemLanguageResultExecution timeMemory
1250552nikdTriple Peaks (IOI25_triples)C++20
26.90 / 100
2096 ms1860 KiB
#include "triples.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

long long count_triples(std::vector<int> H) {
  int n = H.size();
  ll sol = 0;
  for(int i = 0; i<n; i++){
    for(int j = i+1; j<n; j++){
        set<int> s;
        if(j-i == H[i]){
            if(j+H[j] < n && H[j+H[j]] == H[i]+H[j]){
                if(!s.count(j+H[j])){
                    sol++;
                    s.insert(j+H[j]);
                }
            }
            if(H[j] > H[i] && j + H[j] - H[i] < n && H[j+H[j]-H[i]] == H[j]-H[i]){
                if(!s.count(j+H[j] - H[i])){
                    sol++;
                    s.insert(j+ H[j]-H[i]);
                }
            }
        }
        if(j-i == H[j]){
            if(j+H[i] < n && H[j+H[i]] == H[j]+H[i]){
                if(!s.count(j+H[i])){
                    sol++;
                    s.insert(j+H[i]);
                }
            }
            if(H[i]-H[j] != H[j] && H[i] > H[j] && j + H[i] - H[j] < n && H[j+H[i]-H[j]] == H[i]-H[j]){
                if(!s.count(j+H[i]-H[j])){
                    sol++;
                    s.insert(j+H[i]-H[j]);
                }
            }
        }
        if(i + H[i] < n && i+H[i] > j && j-i == H[i+H[i]] && H[i] == H[j] + H[i+H[i]]){
            if(!s.count(i+H[i])){
                sol++;
                s.insert(i+H[i]);
            }
        }
        if(H[i] != H[j] && i+H[j] < n && i+H[j] > j && j-i == H[i+H[j]] && H[i+H[j]] + H[i] == H[j]){
            if(!s.count(i+H[j])){
                sol++;
                s.insert(i+H[j]);
            }
        }
    }
  }
  return sol;
}


std::vector<int> construct_range(int M, int K) {
    /*int NUM_BEST = 1;
    auto rec = [&](auto&& rec, vector<vector<int>> h, int n)->vector<int>{
        vector<vector<int>> hh((M-1)*h.size());
        for(int i = 0; i<h.size(); i++){
            for(int j = 1; j<M; j++){
                hh[i*(M-1)+j-1] = h[i];
                hh[i*(M-1)+j-1].push_back(j);
            }
        }
        vector<ll> str(hh.size());
        for(int i = 0; i<hh.size(); i++) str[i] = count_triples(hh[i]);
        vector<int> idx(hh.size());
        iota(idx.begin(), idx.end(), 0);
        sort(idx.begin(), idx.end(), [&](int a, int b){return str[a] > str[b];});
        vector<vector<int>> h_(NUM_BEST);
        for(int i =0; i<NUM_BEST; i++) h_[i] = hh[idx[i]];
        if(n == M) return h_[0];
        return rec(rec, h_, n+1);
    };
    vector<vector<int>> init(M-1);
    for(int i = 0; i<M-1; i++) init[i] = {i+1};
    vector<int> best = rec(rec, init, 2);
    cerr << count_triples(best) << '\n';
    return best;*/
    int kk = M/20;
    vector<int> sol(M);
    vector<int> tw = {13, 2, 1, 1, 3, 2, 3, 4, 1, 2, 1 ,3, 1, 6, 5, 4, 7, 6, 5, 1};
    for(int i = 0; i<M; i++) sol[i] = tw[i%20];
    return sol;
}
#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...