题目:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=33058
想清楚增加点p后,会产生的情况,
一,这个点可能本身没有优势,因此直接忽略。二,这个点有优势,则把他加入到集合中,把因这个点的加入而没有优势的点删除。
#include <cmath>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#include <stack>
using namespace std;
typedef long long LL;
#define EPS 10e-9
#define INF 0x3f3f3f3f
#define REP(i,n) for(int i=0; i<(n); i++)
struct point{
int a,b;
bool operator <(const point& t) const {
return a<t.a||(a==t.a&&b<t.b);
}
};
multiset<point> s;
multiset<point>::iterator it;
int main(){
int t,n,ca=1,a,b;
scanf("%d",&t);
for(int ca=1;ca<=t;ca++){
if(ca>1) printf("\n");
printf("Case #%d:\n",ca);
scanf("%d",&n);
s.clear();
while(n--){
scanf("%d %d",&a,&b);
point p = (point){a,b};
it=s.lower_bound(p);
if(it==s.begin()||(--it)->b>b){
s.insert(p);
it=s.upper_bound(p);
while(it!=s.end()&&it->b >= b) s.erase(it++);
}
printf("%d\n",s.size());
}
}
return 0;
}