傳送門
題目說a[i]遞增 , 極大降低了難度
我們將一樣的幾個點縮成乙個點 , 記錄l , r , num 表示縮的這個點對應的原區間以及長度
記錄pos 表示這個點對應縮的哪個點
然後直接對num 用st表
查詢即為
#include#define n 100050
using namespace std;
int n,q,a[n],l[n],r[n],pos[n];
int tot,st[n][20],log[n];
int rmq(int l,int r)
int main()
for(int i=2;i<=tot;i++) log[i]=log[i/2]+1;
for(int i=1;i<=17;i++)
for(int j=1;j<=tot;j++)
st[j][i] = max(st[j][i-1] , st[j + (1<
while(q--)
ans = max(ans , r[p1]-x+1);
ans = max(ans , y-l[p2]+1);
ans = max(ans , rmq(p1+1,p2-1));
printf("%d\n",ans);
}}
faebdc的煩惱 莫隊
題面有點難想的莫隊。首先我們肯定要乙個cnt i 記錄難度i出現的次數,但是我們發現每次刪去乙個難度後,如果那個難度的個數恰好是當前最多次數,我們就可能要更新一下答案,而這取決於有多少難度的個數恰好是當前最多次數,於是我們再開乙個sum i 記錄有多少難度的個數為i。經過上述分析容易得到莫隊更新規則...
ST表的學習
st表的優勢在於可以把查詢乙個區間的最值的時間複雜度降為o n o n o n 假設有乙個陣列裡有10000個元素,第i個元素記為ar i 我們用f i j 表示從第i個元素開始,向右i 2j 1的 這些元素的最大值。有f i j max f i j 1 f i 2j 1 j 1 這其實是把區間 i...
ST表(倍增表)
介紹st表之前先看看rmq問題是什麼東西吧 rmq range maximum minimum query 顧名思義,這就是指區間最大或最小值 區間最值 st表 spars table,一種可以解決rmq的,基於倍增的資料結構 令 f i j 表示從 i 開始連續 2 j 個數中的最值,如果 i 後...