#include <cstdio> #include <algorithm> using namespace std; int i,j,n,m,x; long long ileTypa[200006]; long long moment[200006]; long long klient[200006],ost,czekaj,suma,piec,kolejka[200006],maxTypa; //int piec[200006]; int main() { scanf(" %d %d",&n,&m); for(i=0;i<n;i++){ scanf(" %I64d",&klient[i]);//moment przyjscia klienta } klient[i++]=0x9184E72A000LL; //printf("tutaj"); sort(klient,klient+i); //printf("jestem"); x=0,maxTypa=0; for(i=0;i<n;i++){ int ile=0; while(klient[i]==klient[i+1]) { ile++; i++; //printf("^"); if (ile>maxTypa) maxTypa= ile; } ileTypa[x]=ile; moment[x++]=klient[i]; } for(i=0;i<m;i++){ ost=0LL;suma=0LL; long long spacja; scanf(" %I64d",&piec); //inicjuj tablice czasow przychodzenia klientow w jednym momencie - optymalizacja kolejka[0] = 0LL; //kolejka[1] = piec; maxTypa++; /* for(j=1;j<=maxTypa;j++){ kolejka[j]=kolejka[j-1]+ j*piec; //printf("! %I64d",kolejka[j]); } */ //printf("\n"); //printf("maxTypa:%d\n",maxTypa); for(j=0;j<x;j++){ spacja = moment[j]-ost; //printf("spacja:%I64d\n",spacja); czekaj = 0LL; if(spacja>0){ if(spacja<piec){ czekaj += piec - spacja; //wszystkie osoby musza poczekac zanim odbierze pierwsza suma += czekaj * ileTypa[j] + czekaj; } if(ileTypa[j] > 0){ czekaj += ileTypa[j] * piec; //suma += kolejka[ ileTypa[j] ]; suma+= ((piec + ileTypa[j]*piec )*ileTypa[j])/2; } ost = moment[j] + czekaj; //printf("cz:%I64d ost:%I64d\n",czekaj,ost); //suma += czekaj; }else if (spacja<=0) { czekaj = ileTypa[j] * piec + piec; ost += czekaj; //suma += kolejka[ ileTypa[j] +1]; suma+= ((piec + (ileTypa[j]+1)*piec )*(ileTypa[j]+1))/2; //printf("tgyh"); } } printf("%I64d\n",suma); } 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 | #include <cstdio> #include <algorithm> using namespace std; int i,j,n,m,x; long long ileTypa[200006]; long long moment[200006]; long long klient[200006],ost,czekaj,suma,piec,kolejka[200006],maxTypa; //int piec[200006]; int main() { scanf(" %d %d",&n,&m); for(i=0;i<n;i++){ scanf(" %I64d",&klient[i]);//moment przyjscia klienta } klient[i++]=0x9184E72A000LL; //printf("tutaj"); sort(klient,klient+i); //printf("jestem"); x=0,maxTypa=0; for(i=0;i<n;i++){ int ile=0; while(klient[i]==klient[i+1]) { ile++; i++; //printf("^"); if (ile>maxTypa) maxTypa= ile; } ileTypa[x]=ile; moment[x++]=klient[i]; } for(i=0;i<m;i++){ ost=0LL;suma=0LL; long long spacja; scanf(" %I64d",&piec); //inicjuj tablice czasow przychodzenia klientow w jednym momencie - optymalizacja kolejka[0] = 0LL; //kolejka[1] = piec; maxTypa++; /* for(j=1;j<=maxTypa;j++){ kolejka[j]=kolejka[j-1]+ j*piec; //printf("! %I64d",kolejka[j]); } */ //printf("\n"); //printf("maxTypa:%d\n",maxTypa); for(j=0;j<x;j++){ spacja = moment[j]-ost; //printf("spacja:%I64d\n",spacja); czekaj = 0LL; if(spacja>0){ if(spacja<piec){ czekaj += piec - spacja; //wszystkie osoby musza poczekac zanim odbierze pierwsza suma += czekaj * ileTypa[j] + czekaj; } if(ileTypa[j] > 0){ czekaj += ileTypa[j] * piec; //suma += kolejka[ ileTypa[j] ]; suma+= ((piec + ileTypa[j]*piec )*ileTypa[j])/2; } ost = moment[j] + czekaj; //printf("cz:%I64d ost:%I64d\n",czekaj,ost); //suma += czekaj; }else if (spacja<=0) { czekaj = ileTypa[j] * piec + piec; ost += czekaj; //suma += kolejka[ ileTypa[j] +1]; suma+= ((piec + (ileTypa[j]+1)*piec )*(ileTypa[j]+1))/2; //printf("tgyh"); } } printf("%I64d\n",suma); } return 0; } |