BestCoder Sequence

hdu4908:http://acm.hdu.edu.cn/showproblem.php?pid=4908

题意::给定一个序列,1-n的数字,选定一个作为中位数m,要求有多少连续子序列满足中位数是m

题解;自己不会做,然后别人给了一个O(n)的算法,瞬间吓cry。这个算法不好解释,还是看看代码,然后自己画个图就出来了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 long long last;
 7 long long ans[100003];
 8 long long a[40005];
 9 int m,n,cnt,ct,pos;
10 int main(){
11    while(~scanf("%d%d",&n,&m)){
12        memset(ans,0,sizeof(ans));
13        memset(a,0,sizeof(a));
14        last=0;cnt=ct=50000;
15        for(int i=1;i<=n;i++){
16         scanf("%I64d",&a[i]);
17         if(a[i]==m)
18             pos=i;
19        }
20        ans[cnt]++;
21        for(int i=pos+1;i<=n;i++){
22            if(a[i]<m)ans[--cnt]++;
23            else ans[++cnt]++;
24        }
25        last+=ans[ct];
26        for(int i=pos-1;i>=1;i--){
27             if(a[i]<m){
28                 last+=ans[++ct];
29             }
30             else{
31                 last+=ans[--ct];
32             }
33        }
34         printf("%I64d\n",last);
35    }
36 }

BestCoder Sequence

时间: 2024-10-05 16:07:35

BestCoder Sequence的相关文章

BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目意思:给出 一个从1~N 的排列你和指定这个排列中的一个中位数m,从这个排列中找出长度为奇数,中位数是m的子序列有多少个. 我的做法被discuss 中的测试数据一下子就否定了. 这个是别人的做法,暂时留下来,有些地方还没真正弄懂,应该是缺了部分的知识没有学到... 留着先: (1)http://blog.csdn.net/hcbbt/article/details/38377815 (2

hdu4908 &amp; BestCoder Round #3 BestCoder Sequence(组合数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 618    Accepted Submission(s): 214 Problem Description Mr Potato is a code

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

HDU 4908 BestCoder Sequence(组合数学)

HDU 4908 BestCoder Sequence 题目链接 题意:给定一个序列,1-n的数字,选定一个作为中位数m,要求有多少连续子序列满足中位数是m 思路:组合数学,记录下m左边和右边一共有多少种情况大于m的数字和小于n数组的差,然后等于左边乘右边所有的和,然后最后记得加上左右两边差为0的情况. 当时也是比较逗,还用树状数组去搞了,其实完全没必要 代码: #include <cstdio> #include <cstring> #define lowbit(x) (x&am

hdu 4908 BestCoder Sequence 发现M中值是字符串数, 需要预处理

BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 271    Accepted Submission(s): 112 Problem Description Mr Potato is a coder. Mr Potato is the BestCoder. One night, an amazing

hdu 4908 BestCoder Sequence(计数)

题目链接:hdu 4908 BestCoder Sequence 题目大意:给定N和M,N为序列的长度,由1~N组成,求有多少连续的子序列以M为中位数,长度为奇数. 解题思路:v[i]记录的是从1~i这些位置上有多少个数大于M,i-v[i]就是小于M的个数.pos为M在序列中的位置.如果有等式i?j=2?(v[i]?v[j?1]),i≥pos≥j 那么i和j既是一组满足的情况.将等式变形i?2?v[i]=j?2?v[j?1]. #include <cstdio> #include <cs

hdu4908 &amp;amp; BestCoder Round #3 BestCoder Sequence(组合数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 618    Accepted Submission(s): 214 Problem Description Mr Potato is a code

hdu 4908 BestCoder Sequence 找M为中位数的串的数目, 需要预处理

BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 271    Accepted Submission(s): 112 Problem Description Mr Potato is a coder. Mr Potato is the BestCoder. One night, an amazing

[BestCoder Round #3] hdu 4908 BestCoder Sequence (计数)

BestCoder Sequence Problem Description Mr Potato is a coder. Mr Potato is the BestCoder. One night, an amazing sequence appeared in his dream. Length of this sequence is odd, the median number is M, and he named this sequence as Bestcoder Sequence. A