BZOJ1303 [CQOI2009]中位数图
先统计出在b后面位置为i时,大于b和小于b的数字个数之差,然后枚举b前面的数字,在b后面找对应的方案数有多少,做一系列的加法就好
1 #include <cstdio> 2 #include <map> 3 using namespace std; 4 typedef long long LL; 5 int a[100005]; 6 map<int,int>mp; 7 int main(){ 8 int n,m,pos;scanf("%d%d",&n,&m); 9 for(int i = 1;i<=n;++i){ 10 scanf("%d",&a[i]); 11 if(a[i]==m)pos = i; 12 } 13 int x = 0,y = 0; 14 for(int i = pos+1;i<=n;++i){ 15 if(a[i]>m)x++; 16 else y++; 17 mp[x-y]++; 18 } 19 if(pos==1){printf("%d\n",mp[0]+1);return 0;} 20 LL ans = mp[0]; 21 x = 0;y = 0; 22 for(int i = pos-1;i>=1;--i){ 23 if(a[i]>m)x++; 24 else y++; 25 if(x==y)ans++; 26 // printf("i=%d %d\n",i,mp[y-x]); 27 ans+=mp[y-x]; 28 } 29 printf("%lld\n",ans+1); 30 return 0; 31 }
弱者究竟为何而战?!