區間伸縮演算法小禮包

2022-02-19 18:19:03 字數 1364 閱讀 1440

主要還是用來優化結合其他演算法時的複雜度,ssw02就用兩道題**一下總結吧

歡迎**ssw02的部落格:

題面

博覽館有乙個很奇怪的規定,就是在購買門票時必須說明兩個數字,

a和b,代表他要看展覽中的第 a 幅至第 b 幅畫(包含 a 和 b)之間的所有圖畫,而門票

的價錢就是一張圖畫一元。

為了看到更多名師的畫,wangjy希望入場後可以看到所有名師的圖畫(至少各一張)。

可是他又想節省金錢。。。

作為wangjy的朋友,他請你寫乙個程式決定他購買門票時的 a 值和 b 值。

思路

這道題比較水,我們考慮存在任何乙個恰好的合法區間 [l,r] 時,當 l 向右移動時,r 不可能向左移動,所以 l,r 在最小合法時的移動方向一定一樣。

然後直接上**了

**

#includeusing namespace std ;

const int maxn = 1000005 ;

inline int read()

int n , m , cnt[ 2005 ] , a[ maxn ] ;

int q[ maxn ] , l , r , tot , ansl , ansr , ans ;

int main()

while( l <= n )

if( tot != m )break ;

if( r-l+1 < ans )//記錄較小的

ans = r-l+1 , ansl = l , ansr = r ;

if( cnt[ a[l] ]==1 )tot--;

cnt[a[l]]--,l++ ;

} cout《先放上面那道題是為了減輕這道題的思維難度(不過本來這道題也沒什麼思維難度)

區別:1.範圍特別大,當有效的點最多還是 1e6 個 , 考慮讀入後離散化 ,對於每個點上儲存的顏色使用vector存一下即可。

然後就是把上面的單個修改改為離散化後的單點多個修改即可。還是使用類似單調佇列的區間推移操作即可。

#includeusing namespace std ;

inline int read()

int n , k , tot , cnt[ 61 ] , p[ 1000005 ] , id[ 1000005 ] ;

vectornum[ 1000005 ] ;

struct apt[ 1000005 ] ;

inline bool cmp( ap x , ap y ){

return (x.loc==y.loc)?(x.col歡迎**ssw02的部落格:

學習筆記 區間第k小演算法

目錄靜態字首第k小 靜態區間第k小 動態區間第k小 前置知識 值域線段樹,可持久化線段樹,樹狀陣列 題目 給定乙個序列和m次操作,每次操作修改單點或者詢問整個序列第k小的數 首先考慮暴力,對於每次修改都直接排序的話,複雜度為o nmlogn 也可以魔改一下排序方法,不過一般的暴力還是沒辦法過 整體第...

微信小程式伸縮布局案例

個性推薦 歌單主播電台 排行榜私人fm 每日歌曲推薦 雲 新歌榜 推薦歌單 一生中最愛的是誰誰?一生中最愛的是誰誰?一生中最愛的是誰誰?一生中最愛的是誰誰?一生中最愛的是誰誰?一生中最愛的是誰誰?一生中最愛 譚詠麟 page root tabs tabs item tabs item.active ...

區間dp小練

提綱 區間dp一般設計f i j 表示區間i到j的dp值,用幾段小的合併成一段整體,也是分治的思想,轉移時列舉中間點k,從f i k f k 1 j 來合併 1.題目 題解 石子歸併 水題開頭 include include include using namespace std int n,a 1...