1. 程式人生 > 實用技巧 >Balanced Photo

Balanced Photo

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 }