제출 #60752

#제출 시각아이디문제언어결과실행 시간메모리
60752Flugan42선물상자 (IOI15_boxes)C++14
0 / 100
23 ms376 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef pair<ll,ll> ii;
typedef vector<ii> vii;
typedef long double lld;
#define rep(i,a,b) for(ll i = a; i < b; i++)
#define per(i,a,b) for(ll i = a; i >= b; i--)
#define all(x) x.begin(),x.end()
#define sz(x) (ll)(x).size()
#define trav(a,x) for(auto a : x)
#define inf 1000000000000000000

ll n,myL,k;
vi a;

long long find(ll h, ll v){
  if ((h < 0)||(v < 0)) return inf+1;
  if (h+v > n) return inf+1;
  ll l = n-h-v;
  ll res = ((l+k-1)/k)*myL;
  ll cur = h-1;
  while(cur >= 0){
    res += a[cur]*2;
    cur -= k;
  }
  cur = n-v;
  while (cur < n){
    res += (myL-a[cur])*2;
    cur += k;
  }
  return res;
}

long long delivery(int N, int K, int L, int p[]) {
  ll best = inf; n = N, myL = L, k = K;
  rep(i,0,N) {
    if (p[i] == 0) n--;
    else a.push_back(p[i]);
  }

  ll h=n/4,v=n/4;
  best = find(h,v);
  lld step = lld(n);
  while (ll(step) != 0){
    ll dx[9] = {1,1,1,0,0,0,-1,-1,-1};
    ll dy[9] = {-1,0,1,-1,0,1,-1,0,1};
    ll val[9] = {0,0,0,0,0,0,0,0,0};

    rep(_,0,100){
      ll t = 0;
      rep(i,0,9){
        val[i] = find(h+dx[i]*ll(step),v+dy[i]*ll(step));
        if (val[i] < val[t]) t = i;
      }
      if (best != val[t]) { h = h + dx[t], v = v + dy[t]; best = val[t]; }
    }
    step *= 0.9;
  }
  return best;
}
#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...