4 add 2 3 find 1 2 remove 2 3 find 1 2 0
Case 1: 2 3 -1
继续省赛题。题目大意:
add:添加该点
find:找横纵坐标都大于该点的最小的点
remove:删除该点
模拟就好~~用set<pair<int,int> >存。代码贴上:
#include<cstdio> #include<string> #include<set>; using namespace std; pair<int,int>pai;//放在set里 int main(){ int n,kase=0; while(scanf("%d",&n)==1&&n){ printf("Case %d:\n",++kase); set<pair<int,int> >f; char x[7]; while(n--){ scanf("%s",x); scanf("%d%d",&pai.first,&pai.second); if(x[0]=='a') f.insert(pai); else if(x[0]=='r') f.erase(pai); else{//这是难点 set<pair<int,int> >::iterator it=f.lower_bound(pai);//lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器 for(;it!=f.end();it++){ if(it->first>pai.first&&it->second>pai.second){ printf("%d %d\n",it->first,it->second); break;//这么重要的语句竟然忘了!!!!!找到一个点就可以退出来了···· } } if(it==f.end()) printf("-1\n"); } } printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
SDNU 1143.Ivan comes again!【山东省第一届ACM】【7月21】
原文地址:http://blog.csdn.net/a995549572/article/details/46991881