BZOJ 1071 组队

Posted on 2017-03-14 16:19  ziliuziliu  阅读(93)  评论(0编辑  收藏  举报

额。。。。。。

长跪不起。。。。。

他是怎么做到两个指针扫两个数组还不重不漏的统计完的。。。。。。。

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;
}