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...