雜題訓練之九

2022-01-29 08:39:51 字數 1516 閱讀 5752

昨天和大佬們一起複習了

見此題不錯,於是寫一篇題解

題目大意:

求長度在[l,r]的範圍的子串和前k大和

分析:

考慮暴力一點,把所有滿足條件的字串加入乙個堆中

取的前k次就是前k大

發現這樣不太好

這樣的瓶頸在於要考慮所以字串(包括那些不太有用的)

具體實現:

對於區間[l,r],題目要求使得字串和最大,且長度也要在其之間

考慮中間有個點mid,它是max

這樣再將[l,mid-1]和[mid+1,r]壓入堆中

其中找mid要用rmq

又因為區間[l,r]可以平移所以考慮乙個三維組(i,i+l-1,i+r-1)

保證這樣一定不會算漏

code:

#include#include#include#include#include#include#define maxn 500005

#define log 20

#define max(x, y) ((x) > (y) ? (x) : (y))

#define min(x, y) ((x) < (y) ? (x) : (y))

long long sum[maxn], table[maxn][log];

namespace rmq

}int query(int l, int r)

}struct element

element(int o, int l, int r) : o(o), l(l), r(r), t(rmq::query(l, r)) {}

friend bool operator < (const element& a, const element& b)

};std::priority_queue< element > q;

int main()

rmq::init(n);

for (int i = 1; i <= n; i++)

if (i + l - 1 <= n)

q.push(element(i, i + l - 1, min(i + r - 1, n)));

long long ans = 0;

while (k--)

printf("%lld\n", ans);

return 0;

}

雜題訓練之十一

題目大意 詢問樹上a到b,c到d的兩條路徑是否相交 分析 我們容易發現,如果相交,記 x lca a,b y lca c,d 則必有x在cd路徑上或y在ab路徑上 關鍵就在於如何判斷它在路徑上 複習 結合如何判斷乙個點 x 是否在一條最短路上 起點 s 終點 t 各跑一次最短路 為了處理dis 如果...

雜題訓練之十

分析 考慮固定左端點l,列舉它 剩下的任務就是找到最小的r,使之 l,r 能夠出現b的子串行 這樣n r 1也就滿足,ans累加 是反著來的,效果是一樣的 學到了 分析 博弈論先考慮終止狀態 切記不要死迴圈的想 先手只剩一條邊時,先手必敗 後手只剩兩條邊時,先手必勝 然後發現本題唯一和博弈論沾邊的就...

雜題訓練之五

奇數和偶數顯然是獨立的,我們只考慮其中一種即可。如果沒有要求字典序最小的話,則顯然相對位置不變的方案是最優的 那麼我們可以直接得到一種合法方案以及最小代價。我們用xi表示第i個數是往左,往右還是不變,那麼按xi 分段後顯然每一段是獨立的,否則代價一定大了。那麼我們考慮 xi 相同的一段。如果他們都是...