题意:有n个人,每个人有x、y两个属性,每次输入一个人(x,y)。如果当前不存在一个人(x`,y`)的属性满足x`<=x,y`<y或者x`<x,y`<=y,就说这个人是有优势的。每次输入时要求输出当前有多少个人是有优势的。
思路:平衡二叉树。
一个人一旦失去优势就再也不可能得到优势。可以用multiset来存优势人群(因为可能出现x和y完全相同的人)。对于每次输入的人,二分寻找第一个满足?<=x的人,记为(x`,y`),如果y>=y`,那么该人是没有优势的,可以忽略。其他情况下,即这是第一个人或者y<y`,则说明这个人有优势,可以插入到树上,这个时候会导致一些人(x``,y``)失去优势,即满足x`<=x``,y`<=y``的这部分人,需要删掉。
#include<iostream> #include<algorithm> #include<cstdio> #include<set> using namespace std; struct People { int x,y; People(int a,int b):x(a),y(b) {} bool operator < (const People p) const { return x<p.x||(x==p.x&&y<p.y); } }; multiset<People> S; int main() { ; scanf("%d",&T); while(T--) { int x,y; int n; scanf("%d",&n); S.clear(); printf("Case #%d:\n",++kase); while(n--) { scanf("%d%d",&x,&y); People p(x,y); multiset<People>::iterator it=S.lower_bound(p); if(it==S.begin()||!((--it)->y<=y)) { S.insert(p); it=S.upper_bound(p); while(it!=S.end()&&it->y>=y) S.erase(it++); } printf("%d\n",S.size()); } if(T) printf("\n"); } ; }