hdu4908 中位数子串
生活随笔
收集整理的這篇文章主要介紹了
hdu4908 中位数子串
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 給你N個(gè)數(shù)字組成的數(shù)列,然后問(wèn)你這里面有多少個(gè)是以M為中位數(shù)的子序列。
? ? ? ?(1) 就是只有他自己的那種情況 那么sum+1
? ? ? ?(2) 從自己開(kāi)始向左延伸,x, x - 1, x - 2 ...這種可以記錄大于m的個(gè)數(shù)max和小于m的個(gè)數(shù)min當(dāng)兩個(gè)數(shù)相等的時(shí)候(min == max)就 sum++,然后在這樣 mark[max - min]++;記錄差值產(chǎn)生的次數(shù),可以開(kāi)兩個(gè)數(shù)組,一個(gè)寸正差,一個(gè)存負(fù)差,或者直接開(kāi)一個(gè)容器,我開(kāi)的是容器,這個(gè)地方隨意
? ? ? 給你N個(gè)數(shù)字組成的數(shù)列,然后問(wèn)你這里面有多少個(gè)是以M為中位數(shù)的子序列。
思路:
? ? ? 首先分四中簡(jiǎn)單的情況求? ? ? ?(1) 就是只有他自己的那種情況 那么sum+1
? ? ? ?(2) 從自己開(kāi)始向左延伸,x, x - 1, x - 2 ...這種可以記錄大于m的個(gè)數(shù)max和小于m的個(gè)數(shù)min當(dāng)兩個(gè)數(shù)相等的時(shí)候(min == max)就 sum++,然后在這樣 mark[max - min]++;記錄差值產(chǎn)生的次數(shù),可以開(kāi)兩個(gè)數(shù)組,一個(gè)寸正差,一個(gè)存負(fù)差,或者直接開(kāi)一個(gè)容器,我開(kāi)的是容器,這個(gè)地方隨意
? ? ? ?(3) 從自己開(kāi)始向又延伸,跟上面的操作一樣,唯獨(dú)就是在mark[max - min]++那不一樣,這一步不用記錄差值的出現(xiàn)次數(shù),而是直接算 sum += mark[min-max],這里很簡(jiǎn)單,就是優(yōu)化了暴力,這個(gè)題目如果直接暴力是O(n^2)的,這樣算出來(lái)是O(N)的。不是很難理解就不多解釋了,還不懂得看看下面的代碼就懂了,水題一道。
#include<stdio.h> #include<map>#define N 44000 using namespace std;map<int ,int>mark;int num[N] ,L[N] ,R[N];int main () {int sum ,n ,m ,i ,mk;while(~scanf("%d %d" ,&n ,&m)){for(i = 1 ;i <= n ;i ++){scanf("%d" ,&num[i]);if(num[i] == m) mk = i;}mark.clear();sum = 0; int min = 0,max = 0;for(i = mk + 1 ;i <= n ;i ++){num[i] < m ? min++ : max++;if(min == max) sum ++;mark[max - min] ++;}min = 0 ,max = 0;for(i = mk - 1 ;i >= 1 ;i --){num[i] < m ? min ++ : max ++;if(min == max) sum ++;sum += mark[min - max];}printf("%d\n" ,sum + 1);}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu4908 中位数子串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hdu4909 状态压缩(偶数字符子串)
- 下一篇: hdu4907 水dp 或者set