UVA 110020 Efficient Solutions (STL)

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

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

因为可能有重点,用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;
}
时间: 2024-10-15 00:07:02

UVA 110020 Efficient Solutions (STL)的相关文章

UVA 11020 - Efficient Solutions(set)

UVA 11020 - Efficient Solutions 题目链接 题意:每个人有两个属性值(x, y),对于每一个人(x,y)而言,当有另一个人(x', y'),如果他们的属性值满足x' < x, y' <= y或x' <= x, y' < y的话,这个人会失去优势,每次添加一个人,并输出当前优势人个数 思路:由于每个人失去优势后,不可能再得到优势,所以失去优势就可以当成删去这些点,这样的话,就可以用一个multiset来维护点集,每次加入一个点,利用lowerbound,

UVA - 11020 - Efficient Solutions (multiset实现BST)

Efficient Solutions 题目传送:Efficient Solutions AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string>

uva 11020 Efficient Solutions

题意:给你n个人,有两个属性x.y,如果不存在另外一个人x2,y2满足 x2<=x,y2<y 或者 x2<x,y2<=y,那么就称这个人是有优势的,每次给你一个人得信息,问你当前有优势的人的人数是多少? 思路:刘汝佳训练指南P228 mutiset+lower_bound+upper_bound 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<s

UVA - 11020 Efficient Solutions(Multiset)

本题利用multiset解决.根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset.我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势.如果刚刚插入一个人,他是否有优势该如何判断呢?只需要看他左边相邻的点的y坐标是否比他小即可.而如果这个人是有优势的,那么需要先把这个人插入到集合中,然后从upper_bound(P)开始,逐个删除没有优势的点,注意删除时候应写为s.erase(it++),因为删除时候会导致指针向左移动一位,因此还需要it++.这样,

UVA 11020 Efficient Solutions+multiset的应用

题目链接:点击进入 首先来讲,很容易看到我们其实只要维护优势人群的集合:如果加入一个新的人,我们首先看一下优势人群中是否有人会让这个人失去优势,如果没有,则将这个人插入集合中,但要注意到这个人的插入可能会让其它的人失去优势.所以要求这个集合要能支持快速查询和修改操作:而multiset恰好能能满足这个需要. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<set> us

UVa11020 &#183; Efficient Solutions

题目:http://uva.onlinejudge.org/external/110/11020.pdf Problem IEfficient SolutionsInput: Standard Input Output: Standard Output "Our marriage ceremonies are solemn, sobermoments of reflection; also regret, disagreement,argument and mutual recriminatio

UVA - 12005 Find Solutions (最小因子分解)

Description  Find Solutions  Look at the following equation: c = ab - + 1 Now given the value of c, how many possible values of and a and b are there (a and b must be positive integers)? That is you will have to find the number of pairs (a, b) which

UVa第五章STL应用 习题((解题报告))详细!

例题5--9 数据库 Database UVa 1592 <strong><span style="font-size:18px;"><span style="font-size:18px;"><strong><span style="font-size:18px;">#include<iostream> #include<string> #include<

uva 1517 - Tracking RFIDs(STL+几何)

题目链接:uva 1517 - Tracking RFIDs 题目大意:给定S,R,W,P,表示有R个传感器,感应半径为R,W堵墙,P个产品,给定S个传感器的位置,W堵墙的位置(两端点),以及P个产品的位置.输出每个产品可以被那些传感器确定位置.如果传感器和产品之间隔着k堵墙,则距离要加上k. 解题思路:S个数很大,但是R很小,所以枚举每个产品周围坐标加减R的距离范围内的点,判断是否存在传感器,如果存在判断距离是否满足,判断距离的时候要枚举墙的位置,判断两条线段是否相交,利用向量叉积的性质判断即