#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(); } } |
English