题意:给一个N个数的序列,然后给出一个M,问以M为中位数的奇数长度的子序列序列个数。
思路:训练时做的理解错题意了,一上来就连WA几次,中位数的概念都忘了,真是伤..中位数:一组按大小顺序排列起来的数据中处于中间位置的数。
正解思路是:将大于m的数的位置贡献1,小于m的数的位置贡献-1,等于m的数的位置贡献0。然后找到最后一个等于m的位置,取其前面若干个以及其后面的若干个组成奇数个的贡献总和为0,则就是一个满足条件的子序列。
考虑多了,忽略下文,人家题目是n个不同的数。->(本题漏洞:数据太弱了吧估计,在组成子序列的时候,没有判断序列共奇数个的代码也能AC。)
Code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 40000;
int num[maxn+5], cnt[2][maxn*2+5]; //去掉第一维就是不判断序列奇偶
int main()
{
int n, m, x, id, sum, ans;
while(~scanf("%d %d", &n, &m))
{
memset(num, 0, sizeof num);
memset(cnt, 0, sizeof cnt);
ans = 0;
for(int i = 1; i <= n; ++i)
{
scanf("%d", &x);
if(x > m) num[i] = 1;
else if(x < m) num[i] = -1;
else num[i] = 0, id = i;
}
sum = 0;
for(int i = id; i >= 1; --i)
{
sum += num[i];
++cnt[(id-i)%2][sum+maxn];
}
sum = 0;
for(int i = id; i <= n; ++i)
{
sum += num[i];
ans += cnt[(i-id)%2][-sum+maxn];
}
printf("%d\n", ans);
}
return 0;
}
继续加油~