UVA - 11020 Efficient Solutions(Multiset)

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

while(it->y >= y && it!=ms.end()){
       ms.erase(it++);
}写成了:

while(it->y >= y && it!=ms.end()){
       ms.erase(it);

       it++;
} WA了,实在无语,这应该没区别吧?

 

AC代码:

 1 #pragma comment(linker, "/STACK:1024000000,1024000000")
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<math.h>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<set>
10 #include<bitset>
11 #include<map>
12 #include<vector>
13 #include<stdlib.h>
14 #include <stack>
15 using namespace std;
16 #define PI acos(-1.0)
17 #define max(a,b) (a) > (b) ? (a) : (b)
18 #define min(a,b) (a) < (b) ? (a) : (b)
19 #define ll long long
20 #define eps 1e-10
21 #define MOD 1000000007
22 #define N 16000
23 #define inf 1e12
24 int n;
25 struct Node{
26    int x,y;
27    bool operator<(const Node&rhs)const  
28     {  
29         return x<rhs.x||(x==rhs.x&&y<rhs.y);  
30     }  
31 };
32 multiset<Node>ms;
33 multiset<Node>::iterator it;
34 int main()
35 {
36    int ac=0;
37    int t;
38    scanf("%d",&t);
39    for(int ca=0;ca<t;ca++){
40        ms.clear();
41        if(ca>0){
42           printf("\n");
43        }
44        printf("Case #%d:\n", ++ac);
45 
46        scanf("%d",&n);
47        for(int i=0;i<n;i++){
48            int x,y;
49            scanf("%d%d",&x,&y);
50            Node tmp;
51            tmp.x=x;
52            tmp.y=y;
53 
54            it=ms.lower_bound(tmp);
55            if(it==ms.begin() || (--it)->y>y){
56               ms.insert(tmp);
57               it=ms.upper_bound(tmp);
58               while(it->y >= y && it!=ms.end()){
59                  ms.erase(it++);
60                  
61               }
62            }
63            printf("%d\n",ms.size());
64        }
65    }
66     return 0;
67 }
View Code

 

转载于:https://www.cnblogs.com/UniqueColor/p/4875369.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值