1. 程式人生 > 其它 >CF1175E Minimal Segment Cover

CF1175E Minimal Segment Cover

要求至少用幾個線段覆蓋一個區間,多個詢問。我們可以貪心。每次尋找當前已經覆蓋到的位置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