HDU-4908(思维之贡献问题)

来源:互联网 发布:苜蓿地 知乎 编辑:程序博客网 时间:2024/06/18 17:39

题意:给一个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;}

继续加油~