CF1175E Minimal Segment Cover
阿新 • • 發佈:2021-11-04
要求至少用幾個線段覆蓋一個區間,多個詢問。我們可以貪心。每次尋找當前已經覆蓋到的位置l,找左端點在 0~l 能覆蓋到的最右區間,其實對於每個位置0~l,我們只需記錄最右的那個區間即可,然後可以倍增優化這個跳的過程
初始f[0][i]表示的是左端點小於i,右端點最遠的地方,我們可以從從左往右來更新
這裡提供了一個用並查集實現的離線演算法https://www.cnblogs.com/chasedeath/p/12267839.html
const int N = 5e5 + 97; int n, q; int l, r; int f[24][N]; int main() { read(n); read(q); memset(f, 0xff, sizeof f); rep(i, 1, n) { read(l); read(r); f[0][l] = max(f[0][l], r); } rep(i, 1, N - 5) { f[0][i] = max(f[0][i], f[0][i - 1]); } rep(i, 1, 20) { rep(j, 0, N - 5) { if(f[i - 1][j] == -1) continue; f[i][j] = f[i - 1][f[i - 1][j]]; } } while(q--) { read(l); read(r); int ans(0); drp(i, 20, 0) { if(f[i][l]!=-1&&f[i][l]<r) { ans|=(1<<i); l=f[i][l]; } } if(f[0][l] < r) out(-1, '\n'); else out(ans + 1, '\n'); } return 0; }
本文來自部落格園,作者:{2519},轉載請註明原文連結:https://www.cnblogs.com/QQ2519/p/15507431.html