Hay \ (n- \) individual, respectivamente (t_i \) \ tiempo alcanza la estación de origen. Transbordador de coche de la estación de origen a la terminal a la estación de origen requiere \ (m \) minutos. Cada vez que se inicia un horario de autobús gratuito. Encontrar el tiempo mínimo de suma y similares. \ (N \ leq 500, m \ leq 500, t_i \ leq 4 \ times 10 ^ 6 \)
Solución
Conjunto \ (f [i] \) representa la hora de salida del autobús último transporte es \ (i \) , todos \ (t \ leq i \) en los seres humanos, un total de la cantidad de tiempo que espera el autobús
Set \ (s [i] \) representa todos \ (t \ leq i \) una persona \ (T \) y, \ (C [I] \) representa \ (t \ leq i \) humana número, entonces
\ [f [i] = \
max_ {j \ leq im} f [j] + (c [i] -c [j]) i- (s [i] -s [j]) \] optimización teniendo en cuenta la pendiente, en la forma estándar
\ [f [j] + s
[j] = ic [j] + (s [i] -ic [i]) + f [i] \] por consiguiente dispuestos \ (y [j ] = F [J] + S [J], \ X [J] = C [J] \) , proporcionado \ (A [i] = i , B [i] = s [i] -ic [i] \ ) , entonces
\ [y = ax + b +
f [i] \] en la que \ (f [i] \) que se reduce al mínimo, así que para mantener el casco convexo
Nótese, sin embargo, debido a restricciones en la ubicación del punto de transición \ (J \ Leq IM \) , por lo que necesita para mantener una longitud de \ (m \) colas, cada procesados \ (I \) después, si el tamaño de la cola \ (= m \) , tomada desde el punto cabeza del estado \ ((x, y) \ ) se inserta en el casco convexo, y el punto de estado \ ((x [i], y [i]) \) la inserción de la cola
#include <bits/stdc++.h>
using namespace std;
const int N = 4000005;
const int M = 5005;
int n,m,t[M],s[N],c[N],f[N],x[N],y[N],q[N],head,tail,h;
double slope(int b,int a) {
if(x[a]==x[b]) return 1.0*(y[a]-y[b])/(1e-9);
return (double)(y[a]-y[b])/(x[a]-x[b]);
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=1;i<=n;i++) c[t[i]]++, s[t[i]]+=t[i];
for(int i=1;i<=n;i++) h=max(h,t[i]);
for(int i=1;i<h+m;i++) c[i]+=c[i-1], s[i]+=s[i-1];
head=1; tail=0;
for(int i=0;i<h+m;i++) {
if(i-m>=0) {
while(head<tail && slope(q[tail-1],q[tail])>=slope(q[tail],i-m)) --tail;
q[++tail]=i-m;
}
while(head<tail && slope(q[head],q[head+1])<=i) ++head;
int j=q[head];
f[i]=c[i]*i-s[i];
if(head<=tail) f[i]=min(f[i],f[j]+(c[i]-c[j])*i-s[i]+s[j]);
x[i]=c[i];
y[i]=f[i]+s[i];
}
cout<<*min_element(f+h,f+h+m);
}