zoukankan      html  css  js  c++  java
  • UVA

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

    while(it->y >= y && it!=ms.end()){
           ms.erase(it++);
    }写成了:

    while(it->y >= y && it!=ms.end()){
           ms.erase(it);

           it++;
    } WA了,实在无语,这应该没区别吧?

    AC代码:

     1 #pragma comment(linker, "/STACK:1024000000,1024000000")
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<math.h>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<set>
    10 #include<bitset>
    11 #include<map>
    12 #include<vector>
    13 #include<stdlib.h>
    14 #include <stack>
    15 using namespace std;
    16 #define PI acos(-1.0)
    17 #define max(a,b) (a) > (b) ? (a) : (b)
    18 #define min(a,b) (a) < (b) ? (a) : (b)
    19 #define ll long long
    20 #define eps 1e-10
    21 #define MOD 1000000007
    22 #define N 16000
    23 #define inf 1e12
    24 int n;
    25 struct Node{
    26    int x,y;
    27    bool operator<(const Node&rhs)const  
    28     {  
    29         return x<rhs.x||(x==rhs.x&&y<rhs.y);  
    30     }  
    31 };
    32 multiset<Node>ms;
    33 multiset<Node>::iterator it;
    34 int main()
    35 {
    36    int ac=0;
    37    int t;
    38    scanf("%d",&t);
    39    for(int ca=0;ca<t;ca++){
    40        ms.clear();
    41        if(ca>0){
    42           printf("
    ");
    43        }
    44        printf("Case #%d:
    ", ++ac);
    45 
    46        scanf("%d",&n);
    47        for(int i=0;i<n;i++){
    48            int x,y;
    49            scanf("%d%d",&x,&y);
    50            Node tmp;
    51            tmp.x=x;
    52            tmp.y=y;
    53 
    54            it=ms.lower_bound(tmp);
    55            if(it==ms.begin() || (--it)->y>y){
    56               ms.insert(tmp);
    57               it=ms.upper_bound(tmp);
    58               while(it->y >= y && it!=ms.end()){
    59                  ms.erase(it++);
    60                  
    61               }
    62            }
    63            printf("%d
    ",ms.size());
    64        }
    65    }
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    css3 animation 点亮灯光效果
    setTimeout和setInterval
    红绿灯 promise和原始方式实现
    思考3
    转载: 理解Javascript执行过程
    tapable
    SVG: 将 svg 导出成图片
    ES6: Module:
    d3 插值-实现一个简单的 animation
    three.js开发指南(第三版)_案例源码
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4875369.html
Copyright © 2011-2022 走看看