제출 #287274

#제출 시각아이디문제언어결과실행 시간메모리
287274Saboon선물상자 (IOI15_boxes)C++17
100 / 100
899 ms318512 KiB
#include "boxes.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e7 + 10; const ll inf = 1e18; int n, k, L, a, b, A[maxn], B[maxn]; ll dp[maxn], pd[maxn], DP[maxn], opt[maxn], C[maxn]; void calc(int l, int r, int lo, int hi){ if (l >= r) return; int m = (l+r) >> 1; DP[m] = inf; for (int cnt = lo; cnt < hi; cnt++){ if (cnt*k < a-m) continue; int i = max(0,b-(cnt*k-(a-m))); ll x = dp[m] + pd[i] + 1LL*cnt*L; if (x < DP[m]) DP[m] = x, opt[m] = cnt; } calc(l, m, opt[m], hi); calc(m+1, r, lo, opt[m]+1); } ll delivery(int N, int K, int LL, int p[]){ n = N, k = K, L = LL; for (int i = 0; i < n; i++){ if (p[i] <= L/2) A[++a] = p[i]; else B[++b] = L-p[i]; } sort(A+1,A+a+1); sort(B+1,B+b+1); for (int i = 1; i <= a; i++){ if (i <= k) dp[i] = 2LL*A[i]; else dp[i] = dp[i-k] + 2LL*A[i]; } for (int i = 1; i <= b; i++){ if (i <= k) pd[i] = 2LL*B[i]; else pd[i] = pd[i-k] + 2LL*B[i]; } calc(0, a+1, 0, (n+k-1)/k + 1); return min(1LL*((n+k-1)/k)*L, *min_element(DP, DP+a+1)); }

컴파일 시 표준 에러 (stderr) 메시지

boxes.cpp: In function 'void calc(int, int, int, int)':
boxes.cpp:23:18: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   23 |  calc(l, m, opt[m], hi);
      |             ~~~~~^
boxes.cpp:24:25: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   24 |  calc(m+1, r, lo, opt[m]+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...