有一個長度為n的序列a,一個長度為m序列b被稱為螺旋序列當且僅當b1=bm且對于1<=i<=m有bi<=b1。 S需要回答q個詢問,每個詢問用l,r兩個參數描述,表示詢問區間[l,r]的最長連續子螺旋序列的長度。 n,m<=5*10^5;|ai|<=10^9
一開始看到這個數據范圍估計沒人敢去打莫隊,不過事實告訴我們人還是要有點信仰才行。
先用rmq或主席樹之類的方法預處理出next和last數組,next[i]表示一個最小的j滿足a[j]==a[i]且max(a[i..j])==a[i],last同理。 然后就可以上莫隊了。 然后會發現這題用莫隊不資瓷刪除,于是我們就只能用不刪除的莫隊。 那不刪除的莫隊要怎么做呢? 對每個詢問按照左端點所在的塊為第一關鍵字右端點為第二關鍵字排序,然后對于左右端點在同一塊內的詢問暴力處理。對于處理左端點在同一塊內的詢問,顯然右端點只需要往右移也就是添加,每次詢問的時候都先把左端點弄到該塊的最右邊,然后不斷左移,同時左移的時候不該邊全局變量,詢問玩后暴力恢復即可。 對于這題而言我們需要維護若干條鏈,那么我們用一個數組fa[i]記錄第i個位置所在鏈的根節點,f[i]記錄答案。若右端點右移則更新其所在鏈;若左端點左移則其f值為其后繼的f值加上兩段間的長度,最后暴力恢復f即可。 時間復雜度
新聞熱點
疑難解答