給你乙個長為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...