A.Laptopnode
連接:https://ac.nowcoder.com/acm/contest/16/A
來源:牛客網
c++
第一行一個正整數n,i
表示筆記本的數量。接下來n行,每行兩個正整數M
,Si
表示這款筆記本的內存和速度。5
n≤10
,Mi
,Si
≤109
一行,一個正整數,表示被完虐的筆記本數。
Mi
和Si
都是越大越優。i
數據保證M
互不相同,Si
也互不相同。
二維偏序,一種思想,按照某一位進行排序,從而減小一維,而後對剩下的維度進行操做。數組
這道題題意就是找有多少筆記本的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 }