Balanced Photo
农夫约翰正在安排他的N头牛拍照片, 每头牛有一个身高,从1到N编号,排列成一行(h1,h2...hn),每头牛i左边
比他高的牛的数量记为Li,右边比他高的牛的数量记为Ri,如果存在i满足max(Ri,Li)>2*min(Li,Ri)则这个牛i是
不平衡的,现在FJ需要你告诉他有多少头牛不平衡。
输入
输入第一行为N(N<=1e5)
接下来的一行有N个数,每个数表示第i头牛的身高,不超过1e9
输出
输出有多少头牛是不平衡的
样例
输入
7 34 6 23 0 5 99 2
输出
3
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define lowbit(x) x&(-x) 4 using namespace std; 5 int n,sum[100005],r[100005],b[100005],l[100005],ans=0; 6 struct data{ 7 int v,id; 8 }a[100005]; 9 bool cmp(data x,data y) 10 { 11 if(x.v==y.v) 12 return x.id<y.id; 13 else 14 return x.v<y.v; 15 } 16 void add(int x,int val) 17 { 18 while(x<=n) 19 { 20 sum[x]+=val; 21 x+=lowbit(x); 22 } 23 } 24 int ask(int x) 25 { 26 int ans=0; 27 while(x) 28 { 29 ans+=sum[x]; 30 x-=lowbit(x); 31 } 32 return ans; 33 } 34 int main() 35 { 36 scanf("%d",&n); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%d",&a[i].v); 40 a[i].id=i; 41 } 42 sort(a+1,a+1+n,cmp); 43 for(int i=1;i<=n;i++) 44 b[a[i].id]=i; 45 for(int i=1;i<=n;i++) 46 { 47 int k=ask(b[i]); 48 l[i]=i-k-1; 49 add(b[i],1); 50 } 51 memset(sum,0,sizeof(sum)); 52 for(int i=n;i>=1;i--) 53 { 54 int k=ask(b[i]); 55 r[i]=n-i-k; 56 add(b[i],1); 57 } 58 for(int i=1;i<=n;i++) 59 { 60 int maxx=max(l[i],r[i]); 61 int minn=min(l[i],r[i]); 62 if(maxx>2*minn) 63 ans++; 64 } 65 printf("%d",ans); 66 return 0; 67 }