// SIA // Jerzy Wałaszek //--------------- #include <iostream> #include <algorithm> using namespace std; int main() { int n,m,gn,gmin=1000001,gmax=0,*cnt,*gg,g,i,j; long long sum,d,b,pd,pb,*f; ios_base::sync_with_stdio(0); cin >> n >> m; gn = n; cnt = new int[1000000]; // liczniki wzrostów fill(cnt,cnt+1000000,0); // zerujemy liczniki wzrostów while(n--) { cin >> g; // wzrost cnt[g]++; // zliczamy go if(cnt[g] > 1) gn--; // w gn liczba unikalnych wzrostów if(g < gmin) gmin = g; if(g > gmax) gmax = g; } f = new long long[gn+1]; // nasze pole gg= new int[gn+1]; // nasze wzrosty fill(f,f+gn+1,0); // pole jest puste f[0] = -1; // strażnik j = 1; for(i = gmin; i <= gmax; i++) // wypełniamy wzrosty if(cnt[i]) gg[j++] = i; // rozpoczynamy hodowlę trawy pd = 0; // poprzedni dzień pb = 0; // poprzednie koszenie while(m--) { cin >> d >> b; // numer dnia oraz wysokość koszenia sum = 0; if(pb + (d - pd) * gmax > b) // czy trawa urośnie wystarczająco? { for(i = 1; i <= gn; i++) // wzrost trawy f[i] += (d - pd) * gg[i]; pd = d; pb = b; for(i = gn; f[i] > b; i--) // kosimy sum += (f[i] - b) * cnt[gg[i]]; fill(f+i+1,f+gn+1,b); // ustawiamy skoszoną trawę na b } cout << sum << endl; } delete [] cnt; delete [] gg; delete [] f; 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 | // SIA // Jerzy Wałaszek //--------------- #include <iostream> #include <algorithm> using namespace std; int main() { int n,m,gn,gmin=1000001,gmax=0,*cnt,*gg,g,i,j; long long sum,d,b,pd,pb,*f; ios_base::sync_with_stdio(0); cin >> n >> m; gn = n; cnt = new int[1000000]; // liczniki wzrostów fill(cnt,cnt+1000000,0); // zerujemy liczniki wzrostów while(n--) { cin >> g; // wzrost cnt[g]++; // zliczamy go if(cnt[g] > 1) gn--; // w gn liczba unikalnych wzrostów if(g < gmin) gmin = g; if(g > gmax) gmax = g; } f = new long long[gn+1]; // nasze pole gg= new int[gn+1]; // nasze wzrosty fill(f,f+gn+1,0); // pole jest puste f[0] = -1; // strażnik j = 1; for(i = gmin; i <= gmax; i++) // wypełniamy wzrosty if(cnt[i]) gg[j++] = i; // rozpoczynamy hodowlę trawy pd = 0; // poprzedni dzień pb = 0; // poprzednie koszenie while(m--) { cin >> d >> b; // numer dnia oraz wysokość koszenia sum = 0; if(pb + (d - pd) * gmax > b) // czy trawa urośnie wystarczająco? { for(i = 1; i <= gn; i++) // wzrost trawy f[i] += (d - pd) * gg[i]; pd = d; pb = b; for(i = gn; f[i] > b; i--) // kosimy sum += (f[i] - b) * cnt[gg[i]]; fill(f+i+1,f+gn+1,b); // ustawiamy skoszoną trawę na b } cout << sum << endl; } delete [] cnt; delete [] gg; delete [] f; return 0; } |