链接:https://ac.nowcoder.com/acm/contest/16/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。
输入描述:
第一行一个正整数n,i
表示笔记本的数量。接下来n行,每行两个正整数M
,Si
表示这款笔记本的内存和速度。5
n≤10
,Mi
,Si
≤109
输出描述:
一行,一个正整数,表示被完虐的笔记本数。
备注:
Mi
和Si
都是越大越优。i
数据保证M
互不相同,Si
也互不相同。
二维偏序,一种思想,按照某一位进行排序,从而减少一维,然后对剩下的维度进行操作。
这道题题意就是找有多少笔记本的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 }