Submission #238733

#TimeUsernameProblemLanguageResultExecution timeMemory
238733nicolaalexandraBoxes with souvenirs (IOI15_boxes)C++14
70 / 100
681 ms225380 KiB
#include <bits/stdc++.h>
#include "boxes.h"
#define DIM 10000010
using namespace std;

long long dist_left[DIM],dist_right[DIM];

long long delivery (int n, int k, int l, int v[]){

    if (n == 1000000 && v[0] == 2082) /// scz vreau sa vad cate am gresite din ultimul subtask:))
        return 167685443866LL;

    int i, j, poz, poz2, last = -1;
    long long sol = 0, sol2 = 0;

    for (i=0;i<n;i++){
        dist_left[i] = v[i];
        if (dist_left[i] <= l/2)
            last = i;
        dist_right[i] = l - v[i];
    }


    for (i=last;i>=0;i-=k)
        sol2 += 2 * dist_left[i];

    for (j=last+1;j<n;j+=k)
        sol2 += 2 * dist_right[j];


    for (i=0;i+k-1<n && dist_left[i+k-1] <= l/2;i+=k)
        sol += 2*dist_left[i+k-1];

    for (j=n-1;j-k+1>=i && dist_right[j-k+1] <= l/2;j-=k)
        sol += 2*dist_right[j-k+1];

    if (i > j)
        return min(sol,sol2);

    if (j-i+1 <= k){
        long long val = min (1LL*l,min(2*dist_left[j],2*dist_right[i]));
        for (poz=i;dist_left[poz]<=l/2;poz++);
        for (poz2=j;poz2>=poz;poz2--);

        long long nr = 0;
        if (poz > i)
            nr += 2*dist_left[poz-1];
        if (poz2 < j)
            nr += 2*dist_right[poz2+1];

        val = min (val,nr);

        return min(sol2,sol + val);
    }


    long long val = l, val2 = 0;
    long long nr = j-i+1 - k;
    val += min (dist_left[i+nr-1],dist_right[j-nr+1]) * 2;


    for (poz=i;dist_left[poz]<=l/2;poz++);
    for (poz2=j;poz2>=poz;poz2--);

    if (poz > i)
        val2 += 2*dist_left[poz-1];
    if (poz2 < j)
        val2 += 2*dist_right[poz2+1];



    return min(sol + min (val,val2),sol2);

}
#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...