hdu 4908

题意

给你1-n的数,求以m为中位数的子序列有多少个

思路

l【i】表示m左边综合起来比m大的数个数为i

r【i】表示m左边综合起来比m小的数个数为i

那么在右面就可以找到综合起来比m小的个数为i的加上r【i】

比他大的加上l【i】

代码

/* **********************************************
Auther: 请叫我acm渣渣
Created Time: 2015-7-29 16:58:53
File Name   : hdu4908.cpp
*********************************************** */
#include <iostream>
#include <fstream>
#include <cstring>
#include <climits>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <bitset>
#include <functional>
#include <algorithm>
using namespace std;
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
#define ll long long
#define N 111111

int n,m;
int sum ;
int a[N];
int b[N];
int l[N],r[N];
int main(){
    while(scanf("%d%d",&n,&m)==2){
        int mid = 0;
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]==m) mid = i;
        }
        int cur =  0;
        for(int i=mid;i>0;i--){
            if(a[i]>m) cur++;
            if(a[i]<m) cur--;
            if(cur>0) l[cur]++;
            else r[-cur]++;
        }
        int ans= 0 ;
        cur = 0;
        for(int i=mid;i<=n;i++){
            if(a[i]>m) cur++;
            if(a[i]<m) cur--;
            if(cur>=0) ans+=r[cur];
            else ans+=l[-cur];
        }

        printf("%d\n",ans);
    }
}

版权声明:都是兄弟,请随意转载,请注明兄弟是谁

时间: 2025-01-20 07:09:00

hdu 4908的相关文章

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(计数)

题目链接: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

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 Task schedule 需要预处理

Task schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 414    Accepted Submission(s): 210 Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如

hdu 4908 BestCoder Sequence【DP】

题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目大意:给出一个排列,一个m,求出这个排列的连续子序列中有多少个序列式以m为中位数. 由于是一个排列,不会出现重复的数字,记录一下m的位置index,然后以index为分界线,往左求出s[i](表示从i到index之间有多少大于m),b[i](表示从i到index之间有多少小于m),往右求出s[i](表示从index到i之间有多少大于m),b[i](表示从index到i之间有多少小于m).

HDU 4908——BestCoder Sequence

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

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

HDU 4908 BestCoder Sequence

http://acm.hdu.edu.cn/showproblem.php?pid=4908 题意: 求一个[1,N]的全排列中以M为中位数的子序列的个数 思路: 隔了好久填个坑...当初理解错题意了 一开始直接写了个二重循环来扫直接TLE了... 搜了下才想到该怎么用一重解决... 代码:  93MS  1524K #include <cstdio> #include <cstring> using namespace std; #define N 40001 int a[N],

hdu 4908(思路题)

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