日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4908 中位数子串

發布時間:2025/6/17 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4908 中位数子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你N個數字組成的數列,然后問你這里面有多少個是以M為中位數的子序列。


思路:

? ? ? 首先分四中簡單的情況求
? ? ? ?(1) 就是只有他自己的那種情況 那么sum+1
? ? ? ?(2) 從自己開始向左延伸,x, x - 1, x - 2 ...這種可以記錄大于m的個數max和小于m的個數min當兩個數相等的時候(min == max)就 sum++,然后在這樣 mark[max - min]++;記錄差值產生的次數,可以開兩個數組,一個寸正差,一個存負差,或者直接開一個容器,我開的是容器,這個地方隨意

? ? ? ?(3) 從自己開始向又延伸,跟上面的操作一樣,唯獨就是在mark[max - min]++那不一樣,這一步不用記錄差值的出現次數,而是直接算 sum += mark[min-max],這里很簡單,就是優化了暴力,這個題目如果直接暴力是O(n^2)的,這樣算出來是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; }

總結

以上是生活随笔為你收集整理的hdu4908 中位数子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。