#include <stdio.h>
#define N_MAX 500000
#define M_MAX 500000
#define MAX_A 1000000
unsigned int M, // Ilość koszeń (1.. 500*10^3)
N, Nn; // Ilość zasiewów (1..500*10^3)
unsigned int A[MAX_A+1]; // Wartości (1..10^6)
unsigned int Aw[N_MAX];
unsigned long long d[M_MAX]; // Wartości (1..10^12)
long long b[M_MAX]; // Wartości (0..10^12)
long long w[N_MAX]; // Wysokości trawy (0..10^12)
int main()
{
int i, j, val;
long long last, deltaD, prevB;
scanf("%d %d", &N, &M);
for(i = 0; i < N; i++)
{
scanf ("%d", &val);
w[i] = 0;
A[val] ++;
}
j = 0;
for(i = 0; i <= MAX_A ; i++)
{
if(A[i] >0)
{
Aw[j] = i;
A[j++] = A[i];
}
}
Nn = j;
fprintf(stderr, "N=%d Nn=%d\n", N, Nn);
scanf("%lld %lld", d, b);
last = d[0];
for (i= 1; i < M;i++)
{
scanf("%lld %lld", d+i, b+i);
d[i] -= last; // wpisujeny różnicę pomiędzy koszeniami
last += d[i];
}
prevB = 0;
deltaD = 0;
for(i = 0; i < M; i++)
{
unsigned long long sum ;
sum = 0;
deltaD += d[i];
if( b[i] - prevB < deltaD*Aw[Nn-1])
{
for(j = 0; j < Nn; j++)
{
w[j] += deltaD*Aw[j];
if(w[j] > b[i])
{
sum += A[j]*(w[j] - b[i]);
w[j] = b[i];
}
}
prevB = b[i];
deltaD = 0;
}
printf("%lld\n", sum);
}
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 | #include <stdio.h> #define N_MAX 500000 #define M_MAX 500000 #define MAX_A 1000000 unsigned int M, // Ilość koszeń (1.. 500*10^3) N, Nn; // Ilość zasiewów (1..500*10^3) unsigned int A[MAX_A+1]; // Wartości (1..10^6) unsigned int Aw[N_MAX]; unsigned long long d[M_MAX]; // Wartości (1..10^12) long long b[M_MAX]; // Wartości (0..10^12) long long w[N_MAX]; // Wysokości trawy (0..10^12) int main() { int i, j, val; long long last, deltaD, prevB; scanf("%d %d", &N, &M); for(i = 0; i < N; i++) { scanf ("%d", &val); w[i] = 0; A[val] ++; } j = 0; for(i = 0; i <= MAX_A ; i++) { if(A[i] >0) { Aw[j] = i; A[j++] = A[i]; } } Nn = j; fprintf(stderr, "N=%d Nn=%d\n", N, Nn); scanf("%lld %lld", d, b); last = d[0]; for (i= 1; i < M;i++) { scanf("%lld %lld", d+i, b+i); d[i] -= last; // wpisujeny różnicę pomiędzy koszeniami last += d[i]; } prevB = 0; deltaD = 0; for(i = 0; i < M; i++) { unsigned long long sum ; sum = 0; deltaD += d[i]; if( b[i] - prevB < deltaD*Aw[Nn-1]) { for(j = 0; j < Nn; j++) { w[j] += deltaD*Aw[j]; if(w[j] > b[i]) { sum += A[j]*(w[j] - b[i]); w[j] = b[i]; } } prevB = b[i]; deltaD = 0; } printf("%lld\n", sum); } return 0; } |
English