您的位置:首页 > 其它

UVA 110020 Efficient Solutions (STL)

2015-09-13 18:12 253 查看
把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点。

那么所有有优势的点将会形成一条下凹的曲线。

因为可能有重点,用multiset,按照x优先,相同时再比较y的顺序排序,动态维护满足条件的总人数。

当新加的P点的y坐标大于左边的点的时候没有优势,忽略,用lower_bound判断一下。

当新加的P点有优势,但是可能使得其他的的点失去优势,依次把后面的点不满足条件的点删除。

红黑树好复杂。

#include<bits/stdc++.h>
using namespace std;

struct Point
{
int x,y;
bool operator < (const Point & r) const {
return x < r.x || ( x == r.x && y < r.y );
}
};

multiset<Point> S;

int main()
{
int T, kas = 0; scanf("%d",&T);
while(T--){
if(kas) puts("");
int n;
scanf("%d",&n);
printf("Case #%d:\n",++kas);
S.clear();
while(n--){
Point P;
scanf("%d%d",&P.x,&P.y);
auto it = S.lower_bound(P);
if(it == S.begin() || (--it)->y > P.y){
it = S.insert(P);
while(it != S.end() && *it == P) it++;
while(it != S.end() && it->y >= P.y) S.erase(it++);
}
printf("%d\n",S.size());
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: