标签:
1 1 1 5 3 4 5 3 2 1
1 3HintFor the second case, {3},{5,3,2},{4,5,3,2,1} are Bestcoder Sequence.
题目意思是 再给出的全排列(1~n每一个数字仅仅出现一次)中,找到一个奇数个的子串,要求子串的中位数(大小排序后正中间的数), 为M;
求这样的子串有多少.
首先要把M这个数左边的串预处理下, 假设 遇到大于M的数ji++,然后记录在data[当前位置的奇偶][当前记录的ji] ,假设当前位置的数小于M的数,ji--; 由于ji记录在数组里,所以ji 要价格50000 以保证不会出现负数的情况.
然后再处理右边的串,ji 又一次计数,
ans+data[位置奇偶, 假设两个位置奇偶同样,代表这条串有奇数个元素][-ji 加个符号,找到前面处理过的左串中,能够互补的串,达到大于M的数和小于M的数 一样多];
相同加个ji取负数后 相同加个 50000,和前面保存一致
#include<stdio.h> #include<string.h> int big(int a) { return a+50000; } int a[50000],ji,data[2][200000]; int main() { int n,m,i,j,wei; int ans; while(scanf("%d%d",&n,&m)!=EOF) { ans=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]==m) wei=i; } ji=0; memset(data,0,sizeof(data)); for(i=wei;i>=1;i--) { if(a[i]<m) ji--; if(a[i]>m) ji++; if(i&1) data[1][big(ji)]++; else data[0][big(ji)]++; } ji=0; for(i=wei;i<=n;i++) { if(a[i]<m) ji--; if(a[i]>m) ji++; if(i&1) ans+=data[1][big(-ji)]; else ans+=data[0][big(-ji)]; } printf("%d\n",ans); } return 0; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。
hdu 4908 BestCoder Sequence 发现M中值是字符串数, 需要预处理
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/4643828.html