牛客网 牛客练习赛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 }
原文地址:https://www.cnblogs.com/ZERO-/p/11447589.html