Submission #1032101

#TimeUsernameProblemLanguageResultExecution timeMemory
1032101SonicMLBoxes with souvenirs (IOI15_boxes)C++14
0 / 100
1 ms2396 KiB
#include <iostream>
#include <algorithm>
#include "boxes.h"
#include <vector> 

using namespace std;

typedef long long ll;

int const NMAX = 1e7;
ll preA[1 + NMAX];
ll preB[1 + NMAX];

vector <int> a;
vector <int> b;
int centre = 0;

void buildPre(int k) {
  for(int i = 0;i < a.size() && i < k;i++) {
    preA[i] = 2 * a[i];
  }
  for(int i = k;i < a.size();i++) {
    preA[i] = preA[i-k] + 2 * a[i];
  }
  for(int i = 0;i < b.size() && i < k;i++) {
    preB[i] = 2 * b[i];
  }
  for(int i = k;i < b.size();i++) {
    preB[i] = preB[i-k] + 2 * b[i];
  }
}

ll delivery(int n, int k, int l, int positions[]) {
  //cerr << "Damn, not here\n";
  for(int i = 0;i < n;i++) {
    int pos = positions[i];
    if(l % 2 == 0 && pos == l / 2) {
      centre = pos;
    } else if(pos <= l / 2) {
      a.push_back(pos);
    } else {
      b.push_back(l - pos);
    }
  }
  //cerr << "Fourth Chaos Emerald\n";
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  buildPre(k);
  //cerr << "I am all of me!\n";
  ll ans = preA[a.size()-1] + preB[b.size()-1];
  int limA = a.size()-1, limB = b.size()-1;
  //cerr << ans << '\n';
  for(int round = 1;round < (n - 1) / k + 1;round++) {
    for(int j = 0;j < k;j++) {
      if(preA[limA] - preA[limA-1] < preB[limB] - preB[limB-1]) {
        limA--;
      } else {
        limB--;
      }
    }
    ll tans = 1LL * l * round + preA[limA] + preB[limB];
    ans = min(ans, tans);
  }
  //cerr << "Just like taking candy from a baby, which is fine by me\n";
  return ans;
}

Compilation message (stderr)

boxes.cpp: In function 'void buildPre(int)':
boxes.cpp:19:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |   for(int i = 0;i < a.size() && i < k;i++) {
      |                 ~~^~~~~~~~~~
boxes.cpp:22:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |   for(int i = k;i < a.size();i++) {
      |                 ~~^~~~~~~~~~
boxes.cpp:25:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   25 |   for(int i = 0;i < b.size() && i < k;i++) {
      |                 ~~^~~~~~~~~~
boxes.cpp:28:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |   for(int i = k;i < b.size();i++) {
      |                 ~~^~~~~~~~~~
boxes.cpp: In function 'll delivery(int, int, int, int*)':
boxes.cpp:51:22: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   51 |   int limA = a.size()-1, limB = b.size()-1;
      |              ~~~~~~~~^~
boxes.cpp:51:41: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   51 |   int limA = a.size()-1, limB = b.size()-1;
      |                                 ~~~~~~~~^~
#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...