您的位置:首页 > 其它

BZOJ1071 [SCOI2007]组队

2014-10-05 18:58 344 查看
说好的一天一题解来啦~(其实是给马上要来的NOIP模拟赛加点RP>.<)

Vfk大神说是n^2乱搞,于是蒟蒻就开始乱搞,结果发现怎么搞都是O(n ^ 3)的。。。

后来请教了snake大神,他说先给sum = A * h + B * s排序,然后枚举h和s的最小值。(h -- Height, s -- Speed)

然后就是两个指针乱搞:

先枚举s最小值,然后一边枚举v的最小值一边查询符合条件的人数,因为这一定是相邻的一串。

/**************************************************************
Problem: 1071
User: rausen
Language: C++
Result: Accepted
Time:1708 ms
Memory:1044 kb
****************************************************************/

#include <cstdio>
#include <algorithm>

using namespace std;

struct data{
int s, h, sum;
}x[10000], y[10000];

inline bool cmp1(const data &a, const data &b){
return a.h < b.h;
}

inline bool cmp2(const data &a, const data &b){
return a.sum < b.sum;
}

int n, Max, Min, l, r, cnt, ans;
int A, B, C;

inline bool check1(int p){
return y[p].s <= Max && y[p].s >= Min;
}

inline bool check2(int p){
return x[p].s <= Max && x[p].s >= Min;
}

int main(){
scanf("%d", &n);
scanf("%d%d%d", &A, &B, &C);
for (int i = 1; i <= n; ++i){
scanf("%d%d", &x[i].h, &x[i].s);
x[i].sum = A * x[i].h + B * x[i].s;
y[i] = x[i];
}

sort(x + 1, x + n + 1, cmp1);
sort(y + 1, y + n + 1, cmp2);
for (int i = 1; i <= n; ++i){
Min = x[i].s, Max = Min + C / B;
l = 0, r = 0, 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)
++r, cnt += check1(r);
while (l < n && x[l + 1].h < x[j].h)
++l, cnt -= check2(l);
ans = max(ans, cnt);
}
}
printf("%d\n", ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: