主要還是用來優化結合其他演算法時的複雜度,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...