NOI 2016 區間(雙指標 線段樹)

2021-08-07 12:24:43 字數 1019 閱讀 3761

noi - 2016 - 區間

首先離散化,然後對所有區間按照區間長度排序。然後用雙指標。雙指標保持 [l

,r] 這段的所有區間疊加後存在疊加次數為

m 的點。然後 an

s等於每一次合法時的最小值。這樣顯然是對的。因為乙個合法的答案一定在某次雙指標區間內計數。

#include

#define lson (rt<<1)

#define rson (rt<<1|1)

using

namespace

std;

const

int n=5e5+7;

const

int inf=0x3f3f3f3f;

inline

int max(int a,int b)

inline

int min(int a,int b)

}inline

void push_up(int rt)

void update(int rt,int l,int r,int ql,int qr,int v)

push_down(rt);

int m=(l+r)>>1;

if(ql<=m) update(lson,l,m,ql,qr,v);

if(qr>m) update(rson,m+1,r,ql,qr,v);

push_up(rt);

}int main()

sort(b,b+k);

k=unique(b,b+k)-b;

for(int i=0;i1;

a[i].r=lower_bound(b,b+k,a[i].r)-b+1;

}sort(a,a+n);

int l=0,r=0;

for(;r1,1,k,a[r].l,a[r].r,1);

if(c[1]>=m)

}printf("%d\n",ans==inf?-1:ans);

return

0;}

線段樹 NOI2016 區間

在數軸上有 n 個閉區間 l 1,r1 l 2,r2 l n,rn 現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x 使得對於每乙個被選中的區間 l i,ri 都有 li x r i 對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最...

NOI2016 區間 線段樹

在數軸上有 n個閉區間 l1,r1 l2,r2 ln,rn 現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x,使得對於每乙個被選中的區間 li,ri 都有 li x ri。對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。...

NOI2016 區間 線段樹

將區間按照長度排序,每次將相同長度的區間插入,直到有乙個點能被至少m個區間覆蓋,這個可以用線段樹維護。這時我們就可以刪除長度小的區間直到不滿足條件。重複做就可以了 1 include 2 include 3 include 4 include 5 include 6 define ll long l...