zoukankan      html  css  js  c++  java
  • hdu 4908 BestCoder Sequence

    比赛的时候绝逼整不出来啊。看了别人的blog,才理解什么解法

    參考:http://blog.csdn.net/hcbbt/article/details/38377815

    写的言简意赅

    题目给出中位数,求有多少子串也是以m为中尉

    思路:找出m的位置sign,然后向前找比m小。cou++。的index[]在对应的位置加一(等向m后面找的时候发现比m大的元素,构成了一个BestCoder Sequence,直接就sum+=index[])。比m大,cou--,也在的index[]在对应的位置加一(这样就把m前面比m大的数 也增加到准备数组index中,当m后面有比m大的时候sum+=index[],就把m前面比m大的元素也算上了,也构成了一个BestCoder Sequence)


    /*************************************************************************
    	> File Name: hdu4908.cpp
    	> Author: yang
    	> Mail:826123027@qq.com 
    	> Created Time: 2014年08月17日 星期日 17:11:59
     ************************************************************************/
    
    #include<iostream>
    #include<algorithm>
    #include<memory.h>
    #include<stdio.h>
    using namespace std;
    #define N 40010
    int main(){
    	int a[N],index[N],mid=N/2;
    	int n,m;
    	while(cin>>n>>m){
    		int sign;
    		for(int i=1;i<=n;i++){
    			scanf("%d",&a[i]);
    			if(a[i]==m) 
    				sign=i;
    		}
    		int cou=0;
    		memset(index,0,sizeof(index));
    		for(int i=sign;i>=1;i--){
    			if(a[i]>m) cou++;
    			if(a[i]<m) cou--;
    			index[mid+cou]++;
    		}
    		cou=0;
    		int sum=0;
    		for(int i=sign;i<=n;i++){
    			if(a[i]>m) cou++;
    			if(a[i]<m) cou--;
    			sum+=index[mid-cou];
    		}
    		cout<<sum<<endl;
    	}
    }
    
    


  • 相关阅读:
    【POJ3069】Saruman's Army
    【POJ2453】An Easy Problem
    【POJ2386】Lake Counting
    【POJ2251】Dungeon Master
    【POJ1664】放苹果
    【基础】枚举学习笔记
    算法时空复杂度【OI缩水版】
    【POJ2018】Best Cow Fences
    【POJ3889】Fractal Streets(分形图)
    【BZOJ2296】随机种子(构造)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6782651.html
Copyright © 2011-2022 走看看