怎么看都是n3
然后弱弱的去膜了题解:http://www.cnblogs.com/rausen/p/4007292.html
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
inline void read(ll &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
int n,ans;
ll A,B,C,Max,Min;
const int N=5005;
struct abcd{
ll sum,h,s;
void calc() { sum=A*h+B*s; }
}x[N],y[N];
bool cmph(const abcd &a, const abcd &b){ return a.h<b.h; }
bool cmps(const abcd &a, const abcd &b){ return a.sum<b.sum; }
inline bool check(abcd x){ return x.s<=Max && x.s>=Min; }
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
int l,r,cnt;
read(n); read(A); read(B); read(C);
for (int i=1;i<=n;i++)
read(x[i].h),read(x[i].s),x[i].calc(),y[i]=x[i];
sort(x+1,x+n+1,cmph);
sort(y+1,y+n+1,cmps);
for (int i=1;i<=n;i++)
{
Min=x[i].s,Max=Min+C/B;
l=r=cnt=0;
for (int j=1;j<=n;j++)
{
while (r<n && y[r+1].sum<=A*x[j].h+B*x[i].s+C)
cnt+=check(y[++r]);
while (l<n && x[l+1].h<x[j].h)
cnt-=check(x[++l]);
ans=max(ans,cnt);
}
}
printf("%d\n",ans);
return 0;
}