Submission #1338720

#TimeUsernameProblemLanguageResultExecution timeMemory
1338720khanhphucscratchTriple Peaks (IOI25_triples)C++20
6.46 / 100
1900 ms2732 KiB
#include "triples.h"
#include<bits/stdc++.h>
using namespace std;
const int lim = 3;
long long count_triples(vector<int> a) {
    /*Subtask 1-3*/
    long long ans = 0;
    int n = a.size();
    for(int i = 1; i <= n; i++) a.push_back(0); //Avoid RTE
    for(int i = 0; i < n; i++){
        for(int j = i+2; j < min(n, i+lim+1); j++){
            //Fix two ends
            //Case 1: a[i] = x, a[j] = y
            if(a[i]+a[j] == j-i && a[i+a[i]] == j-i) ans++;
            //Case 2: a[i] = y, a[j] = x
            if(a[i] != a[j] && a[i]+a[j] == j-i && a[i+a[j]] == j-i) ans++;
            //Case 3: a[i] = x+y, a[j] = x
            if(a[i] == j-i && a[j] < a[i] && a[i+a[j]] == (a[i]-a[j])) ans++;
            //Case 4: a[i] = x+y, a[j] = y
            if(a[i] == j-i && a[j] < a[i] && a[i+(a[i]-a[j])] == (a[i]-a[j]) && a[i] != a[j] * 2) ans++;
            //Case 5: a[i] = x, a[j] = x+y
            if(a[j] == j-i && a[i] < a[j] && a[i+a[i]] == (a[j]-a[i])) ans++;
            //Case 6: a[i] = y, a[j] = x+y
            if(a[j] == j-i && a[i] < a[j] && a[i+(a[j] - a[i])] == (a[j]-a[i]) && a[j] != a[i] * 2) ans++;

        }
    }
    return ans;
}

mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
vector<int> construct_range(int m, int K) {
    if(m > 20){
        vector<int> ans = {1, 1};
        for(int i = 2; i <= m-1; i++) ans.push_back(i);
        return ans;
    }
    vector<int> a;
    for(int i = 1; i <= m; i++) a.push_back(rng()%lim+1);
    int maxval = count_triples(a);
    vector<int> ans = a;
    long long st = chrono::high_resolution_clock::now().time_since_epoch().count();
    while(true){
        a.clear();
        for(int i = 1; i <= m; i++) a.push_back(rng()%lim+1);
        int curval = count_triples(a);
        if(curval > maxval){maxval = curval; ans = a;}
        long long et = chrono::high_resolution_clock::now().time_since_epoch().count();
        if(et - st > 1900000000) break;
    }
    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...