本题利用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 }