牛客網 牛客練習賽4 A.Laptop-二維偏序+離散化+樹狀數組

A.Laptopnode

連接:https://ac.nowcoder.com/acm/contest/16/A
來源:牛客網

c++

時間限制: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進行樹狀數組的維護就能夠了。spa

 

代碼:code

 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\n",ans);
63 }
相關文章
相關標籤/搜索