將區間按照長度排序,每次將相同長度的區間插入,直到有乙個點能被至少m個區間覆蓋,這個可以用線段樹維護。
這時我們就可以刪除長度小的區間直到不滿足條件。
重複做就可以了
1 #include 2 #include 3 #include 4 #include 5 #include 6view code#define ll long long 78
using
namespace
std;910
inline ll read()
1117 ch =getchar();18}
19while(ch >= '
0' && ch <= '9'
) 23
return x *w;24}
2526
const
int maxn = 5e5 + 10;27
28struct
interval inter[maxn];
3233
int ans =2e9;
34int
n, m;
35 mapm;
36int tmp[maxn * 2
];37
intlen;
38int it[maxn][3
];39
int cnt = 0;40
41bool
cmp(interval a, interval b)
4245
46struct
segment seg[maxn * 10
];50
51void pushdown(int
x)52
5758
void pushup(int
x)59
6263
void update(int ul, int ur, int l, int r, int x, int
k)64
70int mid = (l + r) >> 1;71
pushdown(x);
72if(mid >=ul)
75if(mid
78pushup(x);
79return;80
}8182int
main()
8392 sort(tmp + 1, tmp + 1 + 2 *n);
93 len = unique(tmp + 1, tmp + 1 + 2 * n) - tmp - 1;94
//cout<95
for(int i = 1; i <= len; i++)
98 sort(inter + 1, inter + 1 +n, cmp);
99/*
for(int i = 1; i <= n; i++)
102cout<103
/*for(int i = 1; i <= len; i++)
106cout
107//
return 0;
108 inter[0].len = -1, inter[n + 1].len =2e9;
109 it[0][0] =1e9;
110for(int i = 1; i <= n + 1; i++)
116}
117/*
for(int i = 1; i <= cnt; i++)
120cout
121int mi = 0, ma = 0
;122
int status = 0
;123
while(mi <= cnt && ma
131}
132//
cout<133
while(seg[1].maxn >=m)
138 mi++;
139//
cout<140
}141
//cout<142
}143
if(ans ==2e9)
146 printf("
%d\n
", ans);
147return0;
148 }
線段樹 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。對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。...
NOI 2016 區間(雙指標 線段樹)
noi 2016 區間 首先離散化,然後對所有區間按照區間長度排序。然後用雙指標。雙指標保持 l r 這段的所有區間疊加後存在疊加次數為 m 的點。然後 an s等於每一次合法時的最小值。這樣顯然是對的。因為乙個合法的答案一定在某次雙指標區間內計數。include define lson rt 1 ...