[bzoj1071]组队

题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$
从小到大枚举minh,然后答案可以理解为所有s合法-v合法且s合法,对于两个在枚举minv的时候预处理即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,l,r,s,ans,A,B,C;
 4 struct ji{
 5     int h,v,s;
 6 }a[100005],b[100005];
 7 bool cmp1(ji x,ji y){
 8     return x.h<y.h;
 9 }
10 bool cmp2(ji x,ji y){
11     return x.s<y.s;
12 }
13 int main(){
14     scanf("%d%d%d%d",&n,&A,&B,&C);
15     for(int i=1;i<=n;i++){
16         scanf("%d%d",&a[i].h,&a[i].v);
17         a[i].s=a[i].h*A+a[i].v*B;
18         b[i]=a[i];
19     }
20     sort(a+1,a+n+1,cmp1);
21     sort(b+1,b+n+1,cmp2);
22     for(int i=1;i<=n;i++){
23         int m1=a[i].v,m2=a[i].v+C/B;
24         l=r=s=0;
25         for(int j=1;j<=n;j++){
26             while ((r<n)&&(b[r+1].s-A*a[j].h-B*a[i].v<=C))
27                 if ((m1<=b[++r].v)&&(b[r].v<=m2))s++;
28             while ((l<n)&&(a[l+1].h<a[j].h))
29                 if ((m1<=a[++l].v)&&(a[l].v<=m2))s--;
30             ans=max(ans,s);
31         }
32     }
33     printf("%d",ans);
34 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11792569.html