#include<stdio.h> #include<vector> #include<queue> #include<set> #include<algorithm> using namespace std; int main() { vector<int> wzrost_trawy; vector<long long int> dlugosc_trawy; queue<long long int> masa_trawy; int i,n,m,wzrost,j,indeks_cur=0,indeks_next; long long int suma,dzien_prev=0,dzien_next,czas,koszenie,domyslny_wzrost=0,suma_wzrostow=0,wykorzystane_wzrosty; vector<int>::iterator it; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%d",&wzrost); wzrost_trawy.push_back(wzrost); dlugosc_trawy.push_back(0); suma_wzrostow+=wzrost; } sort(wzrost_trawy.begin(),wzrost_trawy.end()); for(i=0;i<m;i++) { scanf("%lld%lld",&dzien_next,&koszenie); czas=dzien_next-dzien_prev; suma=0; j=0; wykorzystane_wzrosty=0; indeks_next=0; for(it=wzrost_trawy.begin();it!=wzrost_trawy.end();++it) { if(j>=indeks_cur && czas*(*it)+domyslny_wzrost>=koszenie) { suma+=(suma_wzrostow-wykorzystane_wzrosty)*czas-(koszenie-domyslny_wzrost)*(n-j); domyslny_wzrost=koszenie; break; } if(j>=indeks_cur && czas*(*it)+domyslny_wzrost<koszenie) { dlugosc_trawy[j]=czas*(*it)+domyslny_wzrost; indeks_next=j+1; wykorzystane_wzrosty+=*it; } else { dlugosc_trawy[j]+=czas*(*it); wykorzystane_wzrosty+=*it; if(dlugosc_trawy[j]>=koszenie) { suma+=dlugosc_trawy[j]-koszenie; dlugosc_trawy[j]=koszenie; if(j==n-1) domyslny_wzrost=koszenie; } else { indeks_next=j+1; } } j++; } dzien_prev=dzien_next; masa_trawy.push(suma); indeks_cur=indeks_next; } while(!masa_trawy.empty()) { printf("%lld\n",masa_trawy.front()); masa_trawy.pop(); } }
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 | #include<stdio.h> #include<vector> #include<queue> #include<set> #include<algorithm> using namespace std; int main() { vector<int> wzrost_trawy; vector<long long int> dlugosc_trawy; queue<long long int> masa_trawy; int i,n,m,wzrost,j,indeks_cur=0,indeks_next; long long int suma,dzien_prev=0,dzien_next,czas,koszenie,domyslny_wzrost=0,suma_wzrostow=0,wykorzystane_wzrosty; vector<int>::iterator it; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%d",&wzrost); wzrost_trawy.push_back(wzrost); dlugosc_trawy.push_back(0); suma_wzrostow+=wzrost; } sort(wzrost_trawy.begin(),wzrost_trawy.end()); for(i=0;i<m;i++) { scanf("%lld%lld",&dzien_next,&koszenie); czas=dzien_next-dzien_prev; suma=0; j=0; wykorzystane_wzrosty=0; indeks_next=0; for(it=wzrost_trawy.begin();it!=wzrost_trawy.end();++it) { if(j>=indeks_cur && czas*(*it)+domyslny_wzrost>=koszenie) { suma+=(suma_wzrostow-wykorzystane_wzrosty)*czas-(koszenie-domyslny_wzrost)*(n-j); domyslny_wzrost=koszenie; break; } if(j>=indeks_cur && czas*(*it)+domyslny_wzrost<koszenie) { dlugosc_trawy[j]=czas*(*it)+domyslny_wzrost; indeks_next=j+1; wykorzystane_wzrosty+=*it; } else { dlugosc_trawy[j]+=czas*(*it); wykorzystane_wzrosty+=*it; if(dlugosc_trawy[j]>=koszenie) { suma+=dlugosc_trawy[j]-koszenie; dlugosc_trawy[j]=koszenie; if(j==n-1) domyslny_wzrost=koszenie; } else { indeks_next=j+1; } } j++; } dzien_prev=dzien_next; masa_trawy.push(suma); indeks_cur=indeks_next; } while(!masa_trawy.empty()) { printf("%lld\n",masa_trawy.front()); masa_trawy.pop(); } } |