Hi Guys , I Just Tried to solve the Road to Cinema problem , hope you might like it , please share if you’ve any better code .
#include
#include
typedef long long unsigned llu;
typedef unsigned u;
int F(const void*x,const void*y){return*(int*)x-*(int*)y;}
u G[222222],C[222222],V[222222];
llu S[222222];
int main()
{
u n,h,s,t,i,p=-1u,lo,hi,mi;llu x;
scanf(“%u%u%u%u”,&n,&h,&s,&t);
for(i=-1;++i<n;)scanf(“%u%u”,C+i,V+i);
for(i=-1;++i<h;)scanf(“%u”,G+i);
qsort(G,h,sizeof(u),F);
for(G[i=h++]=s;i–;)G[i+1]-=G[i];
qsort(G,h,sizeof(u),F);
for(S[i=0]=*G;++i<h;)S[i]=S[i-1]+G[i];
//for(i=-1;++i<h;)printf(“%u: %u %I64u\n”,i,G[i],S[i]);
while(n–)
{
if(V[n]<G[h-1])continue;
x=S[h-1]<<1; if(V[n]>=(*G<<1)) { lo=0;hi=h; while((mi=(lo+hi)>>1)>lo)
{
if(V[n]>=(G[mi]<<1))lo=mi;
else hi=mi;
}
x-=(S[lo]<<1)+V[n]*(llu)(h-lo-1)-S[h-1];
}
//printf(“V:%u C:%u x:%I64u\n”,V[n],C[n],x);
if(x<=t&&C[n]<p)p=C[n];
}
printf(“%d\n”,p);
return 0;
}