zoukankan      html  css  js  c++  java
  • 牛客网 牛客练习赛4 A.Laptop-二维偏序+离散化+树状数组

    A.Laptop

    链接:https://ac.nowcoder.com/acm/contest/16/A
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
    但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
    拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
    可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。

    输入描述:

    第一行一个正整数n,
    表示笔记本的数量。接下来n行,每行两个正整数M
    i
    ,S
    i
    表示这款笔记本的内存和速度。
    n≤10
    5
    ,M
    i
    ,S
    i
    ≤10
    9

    输出描述:

    一行,一个正整数,表示被完虐的笔记本数。
    示例1

    输入

    复制
    4
    100 700
    200 500
    50 100
    300 400

    输出

    复制
    1

    备注:

    M
    i
    和S
    i
    都是越大越优。
    数据保证M
    i
    互不相同,S
    i
    也互不相同。

    二维偏序,一种思想,按照某一位进行排序,从而减少一维,然后对剩下的维度进行操作。

    这道题题意就是找有多少笔记本的s和w性能都比一个别的笔记本小。

    通过对s进行离散化然后排序,再对w进行树状数组的维护就可以了。

    代码:

     1 //A-二维偏序+树状数组
     2 /*
     3 二维偏序,就是一个思想,可以用树状数组实现。
     4 */
     5 #include<bits/stdc++.h>
     6 using namespace std;
     7 typedef long long ll;
     8 const int maxn=1e5+10;
     9 
    10 int w[maxn],sum[maxn];
    11 int n;
    12 
    13 struct node{
    14     int x,y;
    15 }a[maxn];
    16 
    17 bool cmp(node a,node b)
    18 {
    19     return a.x<b.x;
    20 }
    21 
    22 int lowbit(int x)
    23 {
    24     return x&(-x);
    25 }
    26 
    27 int query(int n)
    28 {
    29     int ans=0;
    30     for(int i=n;i>0;i-=lowbit(i)){
    31         ans+=sum[i];
    32     }
    33     return ans;
    34 }
    35 
    36 void add(int x)
    37 {
    38     for(int i=x;i<=n;i+=lowbit(i)){
    39         sum[i]++;
    40     }
    41 }
    42 
    43 int main()
    44 {
    45     scanf("%d",&n);
    46     for(int i=1;i<=n;i++){
    47         scanf("%d%d",&a[i].x,&a[i].y);
    48         w[i]=a[i].y;
    49     }
    50     sort(w+1,w+1+n);
    51     int d=unique(w+1,w+1+n)-(w+1);
    52     for(int i=1;i<=n;i++){
    53         a[i].y=lower_bound(w+1,w+1+d,a[i].y)-w;
    54     }
    55     sort(a+1,a+1+n,cmp);
    56     int ans=0;
    57     for(int i=n;i>0;i--){
    58         int cnt=query(a[i].y);
    59         if(n-i-cnt!=0) ans++;//n-i是找比当前i大的,然后再减去cnt是比当前i小的,最后就是都比当前的大的
    60         add(a[i].y);
    61     }
    62     printf("%d
    ",ans);
    63 }
  • 相关阅读:
    jquery 回调函数
    彻底弄懂js循环中的闭包问题
    浅谈JavaScript for循环 闭包
    eclipse maven工程resources目录下的文件夹是包图标解决
    筛选载入的HTML文档
    记坑: ConfigurationProperties 和 RefreshScope
    记坑: ConfigurationProperties 和 RefreshScope
    利用simhash计算文本相似度
    利用simhash计算文本相似度
    利用simhash计算文本相似度
  • 原文地址:https://www.cnblogs.com/ZERO-/p/11447589.html
Copyright © 2011-2022 走看看