牛客練習賽14 B 區間的連續段 倍增打表

2021-08-18 05:42:30 字數 608 閱讀 7512

給你乙個長為n的序列a和乙個常數k

有m次詢問,每次查詢乙個區間[l,r]內所有數最少分成多少個連續段,使得每段的和都 <= k

如果這一次查詢無解,輸出"chtholly"

第一行三個數n,m,k

第二行n個數表示這個序列a

之後m行,每行給出兩個數l r表示一次詢問

輸出m行,每行乙個整數,表示答案

題解:

f[i][j]表示從i點右移2^j個<=k區間到達的右端點。

對於每乙個點二分找到第乙個<=k區間的最右端點,然後通過倍增

求出f[i][1]...f[i][n]

**:#includeusing namespace std;

#define ll long long

ll sum[1000004];

ll f[1000004][22];

int main()

for(int i=0;i<=21;i++)f[n+1][i]=n+1;

for(int i=n;i>=1;i--)

while(m--)

return 0;

}

牛客練習賽14 B 區間的連續段 ST表 倍增

分析 剛開始以為預處理 並查集呢?怎麼也沒想通,看了題解理解了一會。由於k和n都很大,預處理最大時間nlg,查詢最大時間lgn。lg級別的查詢,線段樹?怎麼查呢。倍增是個好東西,倍增 st表,有點區間dp的意思。首先你應該知道什麼是倍增?什麼是st表?其次怎樣狀態轉移的?倍增法 7 2 2 2 1 ...

牛客練習賽25 最長區間

其中表示left len right len可以用乙個len i 表示 len i 表示包括i的在i之前的最長遞增序列 用len陣列可以很方便得記錄到從x往左的left len等於多少 然後向由可以推出right len cnt i 計算每乙個長度i的序列有多少個 其中 乙個i的子長度的序列也會記錄...

牛客練習賽9 B 珂朵莉的值域連續段

一定要注意題目中的 連續 即只需要記錄子樹中的三個要素 最小值min 最大值max和節點個數size 做個dfs遍歷一遍樹,每棵樹的節點size等於本身1 全部子樹的size,max min也是本身與全部子樹的max min比較 include include include include inc...