例题3.19 优势人群 UVa11020

1.题目描述:点击打开链接

2.解题思路:本题利用multiset解决。根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset。我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势。如果刚刚插入一个人,他是否有优势该如何判断呢?只需要看他左边相邻的点的y坐标是否比他小即可。而如果这个人是有优势的,那么需要先把这个人插入到集合中,然后从upper_bound(P)开始,逐个删除没有优势的点,注意删除时候应写为s.erase(it++),因为删除时候会导致指针向左移动一位,因此还需要it++。这样,此时S.size()就是答案。

3.代码:

#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<functional>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define me(s)  memset(s,0,sizeof(s))
#define rep(i,n) for(int i=0;i<(n);i++)
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
//typedef pair <int, int> P;

struct Point
{
    int a,b;
    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()
{
  int T;
  scanf("%d", &T);
  for(int kase = 1; kase <= T; kase++)
    {
    if(kase > 1) printf("\n");
    printf("Case #%d:\n", kase);

    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);//先找到这个人的位置
      if(it == S.begin() || (--it)->b > b) //如果他左边没人 或 他左边的人y值大于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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 18:09:33

例题3.19 优势人群 UVa11020的相关文章

例题1.19 计算器谜题 UVa11549

1.题目描述:点击打开链接 2.解题思路:本题是一道普通的模拟题,根据题意易知计算器显示的数将会出现循环,因为显示的n位数一共就有限种情况,而平方的次数是无限多的.所以不妨一个个的模拟,每次都看新得到的数是否以前出现过,如果出现过就跳出循环.但如何判断是否出现过呢?第一种方法是利用STL中的set,同时写一个Next函数求出下一个k值.下面一共给出三个不同的代码,来分别体会一下效率上的巨大差异. 3.代码: (一,Next函数中使用string,stringstream) #define _CR

2018高考数学真题权威专家评析+2019备考方向解读

2018高考数学真题汇总!权威专家评析+2019备考方向解读 "试卷稳中求新,在保持结构总体稳定基础上,科学灵活地确定试题内容,强调数学应用,突出关键能力."教育部考试中心命题专家认为,2018年高考数学卷一个突出的特点是,根据文理科考生数学素养综合要求,调整文理科同题比例,为新一轮高考数学不分文理科的改革进行了积极探索. 探索内容改革,助推素质教育 教育部考试中心命题专家介绍,根据文理科考生数学素养的综合要求,调整全国Ⅱ卷.全国Ⅲ卷文理科同题比例,为新一轮高考数学不分文理科改革进行了

UVA 11020 Efficient Solutions+multiset的应用

题目链接:点击进入 首先来讲,很容易看到我们其实只要维护优势人群的集合:如果加入一个新的人,我们首先看一下优势人群中是否有人会让这个人失去优势,如果没有,则将这个人插入集合中,但要注意到这个人的插入可能会让其它的人失去优势.所以要求这个集合要能支持快速查询和修改操作:而multiset恰好能能满足这个需要. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<set> us

例题作业(9.1-9.7)

例题9.1 #include<stdio.h> struct student { int num; char *name; char sex; char *address; }stu_1={521,"ghfgh",'M',"hgghgf"}; int main() {printf("%d,%s,%c,%s",stu_1.num,stu_1.name,stu_1.sex,stu_1.address); return 0; } 521,g

Java面试题及答案(基础题122道,代码题19道)

转载自:http://www.blogjava.net/fanyingjie/archive/2007/06/27/126467.aspx JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的

BIT 树状数组 详解 及 例题

(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了.所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多.下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图: 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4

java常见面试题及答案(基础题122道,代码题19道)

JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派

面试题收集-java面试题及答案(基础题122道,代码题19道)

JAVA相关基础知识1.面向对象的特征有哪些方面?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派

java面试题及答案(基础题122道,代码题19道)(转)

JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父