線段覆蓋5

2022-03-09 09:38:19 字數 924 閱讀 9111

codevs線段覆蓋

5離散化+二分查詢,按右端點排序,

f[i]

代表1~i

的滿足不覆蓋的最大值,對於第

i條線段,要麼選,要麼不選,所以方程為

f[i]=max(f[i-1],f[find(i)]+e[i].v);find(i)

是從右往左數第乙個與

i不相交的線段的下標,

ans為

f[n];

#includeusing

namespace

std;

struct

line

}e[1000010

];long

long

n;long

long b[2000010

];long

long f[1000010

];long

long

ans;

void

in(long

long &x)

long

long find(long

long

x)

if (e[r].r <=e[x].l)

return

r;

else

returnl;}

intmain()

sort(b+1,b+2*n+1

);

long

long m=unique(b+1,b+2*n+1)-b-1;

for(long

long i=1;i<=n;i++)

sort(e+1,e+n+1

);

for(long

long i=1;i<=n;i++)

cout

}

CODEVS 3037 線段覆蓋 5

描述 數軸上有n條線段,線段的兩端都是整數座標,座標範圍在0 10 18,每條線段有乙個價值,請從n條線段中挑出若干條線段,使得這些線段兩兩不覆蓋 端點可以重合 且線段價值之和最大。分析 提供兩種思路 利用離散化.因為這道題本來就是離散化的例題.將點排序後依次賦值 1 2n,n為線段的條數 再通過結...

線段樹線段覆蓋(離散化 區間覆蓋)

n n 10000 個人依次貼海報,給出每張海報所貼的範圍li,ri 1 li ri 10000000 求出最後還能看見多少張海報。input 第一行 樣例個數t 第二行 貼海報的人n 第三行 每個人貼海報的範圍 接下來n行 每個人貼海報的範圍 output 對於每乙個輸入,輸出最後可以看到的海報張...

1214 線段覆蓋

貪心解法 解題思路 首先將線段端點調整為左端點小於 或等於 右端點 第二,根據右端點將線段從小到大排序 第三,掃瞄一遍,每次遇到的第乙個與當前的max不相交的即為最優選擇。實現 include includeusing namespace std const int n 101 struct nod...