额。。。。。。
长跪不起。。。。。
他是怎么做到两个指针扫两个数组还不重不漏的统计完的。。。。。。。
orzorzorzorzorzorzorzorzorz
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 5050 using namespace std; int n,a,b,c,ans=0; struct pnt { int h,s; long long sum; }p1[maxn],p2[maxn]; bool cmp1(pnt x,pnt y) {return x.s<y.s;} bool cmp2(pnt x,pnt y) {return x.sum<y.sum;} int main() { scanf("%d%d%d%d",&n,&a,&b,&c); for (int i=1;i<=n;i++) { scanf("%d%d",&p1[i].h,&p1[i].s); p1[i].sum=(long long)a*p1[i].h+b*p1[i].s; p2[i]=p1[i]; } sort(p1+1,p1+n+1,cmp1);sort(p2+1,p2+n+1,cmp2); for (int i=1;i<=n;i++) { int l=0,r=0,sum=0,minh=p1[i].h,maxh=minh+c/a; for (int j=1;j<=n;j++) { int mins=p1[j].s;long long now=(long long)a*minh+b*mins+c; while (r<n && p2[r+1].sum<=now) { r++; if (p2[r].h>=minh && p2[r].h<=maxh) sum++; } while (l<n && p1[l+1].s<mins) { l++; if (p1[l].h>=minh && p1[l].h<=maxh) sum--; } ans=max(ans,sum); } } printf("%d\n",ans); return 0; }