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;
    	}
    }
    
    


  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6782651.html
Copyright © 2011-2022 走看看