#define LL long long
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int m, n; // ilosci klientow, kuchenek
LL T[200000]; // przybycia klientow
LL D[200000]; // czasy pracy kuchenek
LL K[200000]; // czasy pracy kuchenek, posortowane
LL czasy[200000]; // sumaryczne czasy oczekiwania klientow dla poszczegolnych czasow pieczenia z tabeli K[]
map<LL, LL> czas_czekania;
LL czekanie(LL pieczenie) {
LL wolna_od = 0;
LL czas = 0; // czas czekania
for(int i =0; i < n; i++) {
wolna_od += pieczenie;
if (T[i] > wolna_od) wolna_od = T[i];
czas += wolna_od - T[i];
}
return czas;
}
void obliczenia(int imin, int imax){
if(imax-imin<2) return;
if(czasy[imax]==czasy[imin]) {
for(int j=imin+1; j<imax;j++) czasy[j]=czasy[imin];
return;
}
while(K[imin]==K[imin+1]){
czasy[imin+1]=czasy[imin];
imin++;
}
while(K[imax]==K[imax-1]){
czasy[imax-1]=czasy[imax];
imax--;
}
if(imax-imin<2) return;
int centrum = (imin+imax)/2;
czasy[centrum]=czekanie(K[centrum]);
obliczenia(imin,centrum);
obliczenia(centrum,imax);
}
int main() {
scanf("%d", &n);
scanf("%d", &m);
for(int i=0; i < n; i++) {
scanf("%lld", T + i);
}
for(int i=0; i < m; i++) {
scanf("%lld", D + i);
K[i] = D[i];
}
sort(K, K+m);
// obliczenia
czasy[0] = czekanie( K[0] );
czasy[m-1] = czekanie( K[m-1] );
obliczenia(0,m-1);
for(int i = 0; i < m; i++) {
czas_czekania[K[i]] = czasy[i];
}
// wyniki
for(int i = 0; i < m; i++){
printf("%lld \n", czas_czekania[D[i]]);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #define LL long long #include<stdio.h> #include<bits/stdc++.h> using namespace std; int m, n; // ilosci klientow, kuchenek LL T[200000]; // przybycia klientow LL D[200000]; // czasy pracy kuchenek LL K[200000]; // czasy pracy kuchenek, posortowane LL czasy[200000]; // sumaryczne czasy oczekiwania klientow dla poszczegolnych czasow pieczenia z tabeli K[] map<LL, LL> czas_czekania; LL czekanie(LL pieczenie) { LL wolna_od = 0; LL czas = 0; // czas czekania for(int i =0; i < n; i++) { wolna_od += pieczenie; if (T[i] > wolna_od) wolna_od = T[i]; czas += wolna_od - T[i]; } return czas; } void obliczenia(int imin, int imax){ if(imax-imin<2) return; if(czasy[imax]==czasy[imin]) { for(int j=imin+1; j<imax;j++) czasy[j]=czasy[imin]; return; } while(K[imin]==K[imin+1]){ czasy[imin+1]=czasy[imin]; imin++; } while(K[imax]==K[imax-1]){ czasy[imax-1]=czasy[imax]; imax--; } if(imax-imin<2) return; int centrum = (imin+imax)/2; czasy[centrum]=czekanie(K[centrum]); obliczenia(imin,centrum); obliczenia(centrum,imax); } int main() { scanf("%d", &n); scanf("%d", &m); for(int i=0; i < n; i++) { scanf("%lld", T + i); } for(int i=0; i < m; i++) { scanf("%lld", D + i); K[i] = D[i]; } sort(K, K+m); // obliczenia czasy[0] = czekanie( K[0] ); czasy[m-1] = czekanie( K[m-1] ); obliczenia(0,m-1); for(int i = 0; i < m; i++) { czas_czekania[K[i]] = czasy[i]; } // wyniki for(int i = 0; i < m; i++){ printf("%lld \n", czas_czekania[D[i]]); } return 0; } |
English