Submission details
Task:Card game
Sender:aalto26ch_045
Submission time:2026-09-15 01:24:11 +0300
Language:C++ (C++23)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#5ACCEPTED0.00 sdetails
#6ACCEPTED0.01 sdetails
#7ACCEPTED0.03 sdetails
#8ACCEPTED0.21 sdetails
#9ACCEPTED0.21 sdetails
#10ACCEPTED0.21 sdetails
#11ACCEPTED0.00 sdetails
#12ACCEPTED0.00 sdetails
#13ACCEPTED0.00 sdetails
#14ACCEPTED0.33 sdetails
#15ACCEPTED0.21 sdetails

Code

#include <iostream>
#include <vector>
#include <functional>
#include <set>
#include <algorithm>


void printNewLine(){std::cout << "\n";}
template<typename T, typename... Ts>
std::tuple<Ts...> tail(std::tuple<T,Ts...> as){
    return std::apply([](T &a, Ts... b){return std::make_tuple(b...);},as);
}

template<typename T>
void print(T a){std::cout << a;}

template<typename T, typename Ts>
void print(std::tuple<T,Ts> a){
    print(std::get<0>(a));
    print(" ");
    print(std::get<1>(a));
}

template<typename T, typename... Ts>
void print(std::tuple<T,Ts...> a){
    print(std::get<0>(a));
    print(" ");
    print(tail(a));
}
template<typename T>
void println(T a){print(a);printNewLine();}

template<typename T>
void printVec(std::vector<T> arr, int width = -1){
    if (width == -1) width = arr.size();
    for (int i = 0; i < (int)arr.size(); i++){
        if ((i%width) == width-1){
            print(" ");
            println(arr[i]);
        }else if ((i%width) == 0){        
            print(arr[i]);
        }else {
            print(" ");
            print(arr[i]);
        }
    }    
}

std::tuple<int> readInt1(){
    int a;
    std::cin >> a;
    return {a};
}
std::tuple<int,int> readInt2(){
    int a, b;
    std::cin >> a >> b;
    return {a,b};
}
std::tuple<int,int,int> readInt3(){
    int a, b, c;
    std::cin >> a >> b >> c;
    return {a,b,c};
}

std::vector<int> readVecInt(int n){
    std::vector<int> arr(n);
    for (int i = 0; i < n; i++){
        int a;
        std::cin >> a;
        arr[i] = a;
    }
    return arr;
}

std::vector<long long> readVecLong(int n){
    std::vector<long long> arr(n);
    for (int i = 0; i < n; i++){
        long long a;
        std::cin >> a;
        arr[i] = a;
    }
    return arr;
}

std::vector<std::tuple<int,int>> readVecTup2(int n){
    std::vector<std::tuple<int,int>> arr(n);
    for (int i = 0; i < n; i++){
        int a, b;
        std::cin >> a;
        std::cin >> b;
        arr[i] = {a,b};
    }
    return arr;
}

std::vector<std::tuple<int,int,int>> readVecTup3(int n){
    std::vector<std::tuple<int,int,int>> arr(n);
    for (int i = 0; i < n; i++){
        int a, b, c;
        std::cin >> a;
        std::cin >> b;
        std::cin >> c;
        arr[i] = {a,b,c};
    }
    return arr;
}

template<typename T>
void sortBy(std::vector<T> &arr){
    std::sort(arr.begin(),arr.end(),[](const T &a, const T &b){ return a < b; });
}


template<typename T>
T binarySearch(T min, T max, std::function<bool(T)> leq){
    if (min == max) return max;
    T guess = (min+max)/2;
    if (leq(guess)){
        return binarySearch(min,guess,leq);
    }else{
        return binarySearch(guess+1,max,leq);
    }
}

template<typename T>
T binarySearchDecending(T min, T max, std::function<bool(T)> leq){
    std::function<bool(T)> gt = [leq](T x){
        return !leq(x);
    };
    return binarySearch(min,max+1, gt)-1;
}


template<typename T>
double avg(std::vector<T> &arr){
    double mult = 1.0/arr.size();
    double s = 0;
    for (T x : arr){
        s += mult*(double)x;
    }
    return s;
}
/*
template<typename T>
T sum(std::vector<T> &arr){
    T s = 0;
    for (T x : arr){
        s += x;
    }
    return s;
}
*/

template<typename T>
std::vector<T> cloneVec(std::vector<T> a){
    return a;
}

template<typename T>
void extendedFibonachi(std::vector<T> &initial, int nlast, T upto, T mod ){
    for (int i = nlast; i <= upto; i++){
        initial[i] = 0;
        for (int n = 1; n <= nlast && n <= i; n++){
            initial[i] += initial[i-n];
            initial[i] %=mod;
        }
    }
}
template<typename T>
std::vector<T> padding(std::vector<T> &initial, T num, int start, int end){
    std::vector<T> arr(start+initial.size()+end);
    for (int i = 0; i < start; i++){
        arr[i] = num;
    }
    for (int i = 0; i < (int)initial.size(); i++){
        arr[start+i] = initial[i];
    }
    for (int i = 0; i < end; i++){
        arr[start+initial.size()+i] = num;
    }
    return arr;
}

template<typename T>
int findMax(int start, int end, std::function<T(int)> &maxHeuristic){
    T initialGuess = maxHeuristic(start);
    int index = start;
    for (int i = start; i <= end; i++){
        if (initialGuess < maxHeuristic(i)){
            initialGuess = maxHeuristic(i);
            index = i;
        }
    }
    return index;
}

template<typename T>
void operateOnMax(int start, int end, std::function<T(int)> &maxHeuristic, std::function<void(int)> &found){
    found(findMax(start,end,maxHeuristic));
}
#include <stack>

template<typename T>
void stackOperate(T init,std::function<std::vector<T>(T)> operate){
    std::stack<T> stack;
    stack.push(init);
    while (!stack.empty()){
        T next = stack.top();
        stack.pop();
        std::vector<T> nextSteps = operate(next);
        for (T a : nextSteps){
            stack.push(a);
        }
    }
}

template<typename T>
void recursiveVectorSplit(int start, int end, int distl, int distr, std::function<T(int)> &maxHeuristic, std::function<void(int)> &found){
    if (start == end){
        return found(start);
    }else if (end < start){
        return;
    }
    std::tuple<int,int> range = {start,end};
    std::function<std::vector<std::tuple<int,int>>(std::tuple<int,int>)> splitter = [distl, distr,&maxHeuristic,&found](std::tuple<int,int> range){
        auto [start,end] = range;
        int idx = findMax(start, end, maxHeuristic);
        found(idx);
        std::vector<std::tuple<int,int>> next;
        if (idx+distl+1 <= end){
            next.push_back({idx+distl+1,end});
        }
        if (start <= idx-distr-1){
            next.push_back({start, idx-distr-1});
        }
        return next;
    };
    stackOperate(range,splitter);
}




template<typename T>
std::set<T> toSet(std::vector<T> vec){
    std::set<T> c;
    for (T a : vec){ c.emplace(a);}
    return c;
}

template<typename T, typename N>
std::vector<N> map(std::vector<T> a, std::function<N(T)> transform){
    std::vector<N> b(a.size());
    int i = 0;
    for (T x : a){
        b[i] = transform(x);
        i++;
    }
    return b;
}

template<typename N, typename M, typename R>
std::vector<R> zip(std::vector<N> a, std::vector<M> b, std::function<R(N,M)> transform){
    int n = std::min(a.size(),b.size());
    std::vector<R> res(n);
    for (int i = 0; i < n; i++){
        res[i] = transform(a[i],b[i]);
    }
    return res;
}

template<typename T, typename N>
std::vector<N> convertVec(std::vector<T> a){
    std::vector<N> b(a.size());
    int i = 0;
    for (T x : a){
        b[i] = x;
        i++;
    }
    return b;
}

template<typename T, typename R>
R reduce(const std::vector<T> &arr, R init, std::function<R(const R,const T)> transform){
    R current = init;
    for (int idx = 0; idx < (int)arr.size(); idx++){
        current = transform(current,arr[idx]);
    };
    return current;
}
template<typename T>
T max(const std::vector<T> &arr){return reduce(arr, arr[0], static_cast<std::function<T(const T,const T)>>(static_cast<const T& (*)(const T&, const T&)>(std::max<T>)));}
template<typename T>
T min(const std::vector<T> &arr){return reduce(arr, arr[0], static_cast<std::function<T(const T,const T)>>(static_cast<const T& (*)(const T&, const T&)>(std::min<T>)));}

template<typename T>
std::function<T(const T,const T)> add(){return [](T a,T b){return a+b;};}
template<typename T>
std::function<T(const T,const T)> modAdd(T mod){return [mod](T a,T b){return (((a+b)%mod)+mod)%mod;};}
template<typename T, typename R>
std::function<R(const R,const T)> mulAdd(R mul){return [mul](R a,T b){return a+b*mul;};}
template<typename T>
T sum(const std::vector<T> &arr){return reduce(arr, 0, add<T>());}
template<typename T>
T avg(const std::vector<T> &arr){return reduce(arr, 0.0, mulAdd<double,T>(1.0/arr.size()));}

template<typename T>
std::vector<T> dynamicallyComputableList(int n, std::function<T(std::vector<T>&,int)> next){
    std::vector<T> arr(n);
    for (int i = 0; i < n; i++){
        arr[i] = next(arr,i);
    }
    return arr;
}


void cardGame(){
    auto [n] = readInt1();
    auto arr = readVecLong(n);
    arr[0] = 0;
    arr[arr.size()-1] = 0;
    std::function<long long(std::vector<long long>&,int)> walker = [arr](std::vector<long long> &previous, int idx){
        if (idx == 0) return (long long)0;
        if (idx == 1) return arr[1];
        if (idx == 2) return arr[2];
        if (idx == 3) return arr[3];
        if (idx == 4) return arr[1]+arr[4];
        if (idx == 5) return std::max(arr[1],arr[2])+arr[5];
        long long m = 0L;
        m = std::max(m,previous[idx-3]);
        m = std::max(m,previous[idx-4]);
        m = std::max(m,previous[idx-5]);
        m = std::max(m,previous[idx-6]);
        return m + arr[idx];
    };
    std::vector<long long> res = dynamicallyComputableList(n,walker);
    if (res.size() >= 4){
        std::vector<long long> c = {res[res.size()-4],res[res.size()-3],res[res.size()-2],res[res.size()-1]};
        println(max(c));
    } else {
        println(max(arr));
    }
    //printVec(arr);
    /*
    arr = padding(arr,0,1,1);
    //printVec(arr);
    std::function<int(int)> heuristic = [&arr](int idx){
        return arr[idx]-arr[idx-1]-arr[idx-2]-arr[idx+1]-arr[idx+2];
    };
    long long sum = 0;
    std::function<void(int)> operate = [&arr, &sum](int idx){
        arr[idx-2] = 0;
        arr[idx-1] = 0;
        sum += arr[idx];
        arr[idx+1] = 0;
        arr[idx+2] = 0;
        //printVec(arr);
    };
    //printVec(arr);
    //println(arr[arr.size()-1-2]);
    recursiveVectorSplit(2,(int)arr.size()-1-2,2,2,heuristic,operate);
    */
    //println(sum);
}

void continnousSum(){
    auto [n] = readInt1();
    auto arr = readVecLong(n);
    for (int idx = 1; idx < (int)arr.size(); idx++){
        arr[idx] = std::max(arr[idx-1]+arr[idx],arr[idx]);
    };
    println(max(arr));
}

void roulette(){
    auto [n] = readInt1();
    auto arr = readVecLong(n);
    std::vector<long long> heur(n);
    for (int idx = 0; idx < (int)arr.size(); idx++){
        heur[idx] = -arr[(idx-1+n)%n]+arr[idx]-arr[(idx+1)%n];
    };
    printVec(heur);
}

template<typename T>
std::vector<T> distanceTable(std::vector<T> init, std::function<T(T,T)> distance){
    int n = init.size();
    std::vector<T> table(n*n);
    for (int i = 0; i < n; i++){
        table[i+n*i] = init[i];
        for (int j = i-1; j >= 0; j--){
            table[j+n*i] = distance(init[j],table[j+1+n*i]);
        }
        for (int j = i+1; j < n; j++){
            table[j+n*i] = distance(table[j-1+n*i],init[j]);
        }
    }
    return table;
}

void particles(){
    auto [n] = readInt1();
    auto arr = readVecLong(n);
    std::vector<long long> table = distanceTable(arr,add<long long>());
    printVec(table,n);
    //println(cost[n*n-1]);
}


int main() {
    //carManufacturing();
    //bottle();
    //movie();
    //cow();
    //castle();
    //dice();
    cardGame();
    //mariocart();
    //continnousSum();
    //roulette();
    //particles();
    return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
5
9 4 1 6 6

correct output
6

user output
6

Test 2

Verdict: ACCEPTED

input
6
5 6 2 4 10 1

correct output
16

user output
16

Test 3

Verdict: ACCEPTED

input
10
8 9 10 2 7 1 10 10 1 4

correct output
26

user output
26

Test 4

Verdict: ACCEPTED

input
100
1 8 8 5 7 10 9 4 8 10 6 3 8 7 ...

correct output
243

user output
243

Test 5

Verdict: ACCEPTED

input
1000
10 7 5 6 5 2 5 3 2 2 1 6 8 7 8...

correct output
2230

user output
2230

Test 6

Verdict: ACCEPTED

input
10000
9 1 8 2 6 5 1 3 3 10 6 3 9 3 1...

correct output
22363

user output
22363

Test 7

Verdict: ACCEPTED

input
100000
5 5 4 6 8 7 9 6 3 2 5 8 7 3 5 ...

correct output
226636

user output
226636

Test 8

Verdict: ACCEPTED

input
1000000
5 8 5 7 9 1 9 10 3 6 1 8 3 9 7...

correct output
2259395

user output
2259395

Test 9

Verdict: ACCEPTED

input
1000000
4 5 3 5 4 3 6 7 10 6 3 9 7 9 1...

correct output
2260761

user output
2260761

Test 10

Verdict: ACCEPTED

input
1000000
10 3 6 7 7 10 4 4 5 2 9 4 6 10...

correct output
2260407

user output
2260407

Test 11

Verdict: ACCEPTED

input
3
87 3 123

correct output
3

user output
3

Test 12

Verdict: ACCEPTED

input
2
175 95

correct output
0

user output
0

Test 13

Verdict: ACCEPTED

input
1
42

correct output
0

user output
0

Test 14

Verdict: ACCEPTED

input
1000000
1000 1000 1000 1000 1000 1000 ...

correct output
333333000

user output
333333000

Test 15

Verdict: ACCEPTED

input
1000000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
333333

user output
333333