• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

cynchanpin

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

UVA 11020 Efficient Solutions+multiset的应用

题目链接:点击进入
首先来讲,非常easy看到我们事实上仅仅要维护优势人群的集合;假设增加一个新的人,我们首先看一下优势人群中是否有人会让这个人失去优势,假设没有,则将这个人插入集合中。但要注意到这个人的插入可能会让其他的人失去优势。所以要求这个集合要能支持高速查询和改动操作。而multiset恰好能能满足这个须要。
代码例如以下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;

struct Point
{
    int a,b;

    ///Set中的元素按x进行排序
    bool operator <(const Point& rhs) const
    {
          return a<rhs.a||(a==rhs.a&&b<rhs.b);
    }
};

multiset<Point>S;
multiset<Point>::iterator it;

int main()
{
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    for(int Case=1;Case<=T;Case++)
    {
        if(Case!=1)
          printf("\n");
        printf("Case #%d:\n",Case);

        int n,a,b;
        scanf("%d",&n);
        S.clear();

        while(n--)
        {
            scanf("%d%d",&a,&b);
            Point P=(Point){a,b};
            it = S.lower_bound(P); ///在红黑树中查找第一个小于P的元素
            if(it==S.begin()|| (--it)->b >=b ) ///假设P也具有优势
            {
                S.insert(P);
                it = S.upper_bound(P); ///it以后的元素都会被影响
                while(it!=S.end()&&it->b >=b) S.erase(it++); ///删除掉失去优势的人
            }
            printf("%d\n",S.size());
        }
    }
  return 0;
}

posted on 2017-06-22 19:33  cynchanpin  阅读(215)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3