SET的用法
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true
end() 返回指向最后一个元素的迭代器
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
BZOJ p2761
#include <cstdio> #include <cstring> #include <set> const int maxn=50010; using namespace std; int n,m,t; int tmp; int ans[maxn+1]; int main() { scanf("%d",&t); while (t--) { set<int>S; int tt=0; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&tmp); if (S.count(tmp)<1) ans[++tt]=tmp,S.insert(tmp); } for (int i=1;i<=tt;i++) if (i!=tt) printf("%d ",ans[i]); else printf("%d\n",ans[i]); } }
BZOJ p1208
#include<cstdio> #include<set> using namespace std; const int inf=~0U>>2; typedef set<int>::iterator sit; set<int> s; int main() {int n,a,b,ans=0,type; scanf("%d",&n); s.insert(inf); s.insert(-inf); while (n--) {scanf("%d%d",&a,&b); if (s.size()==2)type=a,s.insert(b); else if(type==a)s.insert(b); else {sit i=s.lower_bound(b); int r=*i-b,l=b-*(--i); if (l<=r) ans+=l,s.erase(i); else ans+=r,s.erase(++i); ans%=1000000;} } printf("%d\n",ans); }