# P6-16
## Sol1.使用邊界條件二分搜
題目link: https://judge.tcirc.tw/ShowProblem?problemid=d118
AC (38ms, 1.9MB)
```cpp=
#include<bits/stdc++.h>
using namespace std;
const int N = int(1e5+5);
int n, dp[N] = {0};
typedef struct{
int s, t, e;
}seg;
seg s[N];
bool cmp(seg s1, seg s2){
return s1.t < s2.t;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1;i <= n;i ++){
cin >> s[i].s >> s[i].t >> s[i].e;
}
dp[0] = 0;
s[0].e = 0;
s[0].t = -1;
sort(s+1, s+n+1, cmp);
for(int i = 1;i <= n;i ++){
int l = 1;
int r = n;
while(l < r){
int mid = (l + r) / 2;
if (s[mid].t < s[i].s)
l = mid+1;
else
r = mid;
}
dp[i] = dp[l-1] + s[i].e;
if (dp[i] < dp[i-1]) dp[i] = dp[i-1];
}
cout << dp[n];
}
```
## Sol2.使用lower_bound()
AC (34ms, 1.1MB)
```cpp=
#include<bits/stdc++.h>
using namespace std;
const int N = int(1e5+5);
int n, dp[N] = {0};
typedef struct{
int s, t, e;
}seg;
seg s[N];
bool cmp(seg s1, seg s2){
return s1.t < s2.t;
}
bool cmp2(seg p, int x){
return p.t < x;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1;i <= n;i ++){
cin >> s[i].s >> s[i].t >> s[i].e;
}
dp[0] = 0;
s[0].e = 0;
s[0].t = -1;
sort(s+1, s+n+1, cmp);
for(int i = 1;i <= n;i ++){
int l = lower_bound(s, s + i, s[i].s, cmp2) - s;
dp[i] = dp[l-1] + s[i].e;
if (dp[i] < dp[i-1]) dp[i] = dp[i-1];
}
cout << dp[n];
}
```
## Sol3.使用跳躍二分搜
AC (39ms, 1.8MB)
```cpp=
#include<bits/stdc++.h>
using namespace std;
const int N = int(1e5+5);
int n, dp[N] = {0};
typedef struct
{
int s, t, e;
} seg;
seg s[N];
bool cmp(seg s1, seg s2)
{
return s1.t < s2.t;
}
bool cmp2(seg p, int x)
{
return p.t < x;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> s[i].s >> s[i].t >> s[i].e;
}
dp[0] = 0;
s[0].e = 0;
s[0].t = -1;
sort(s+1, s+n+1, cmp);
for(int i = 1; i <= n; i ++)
{
int l = 0;
for (int jump=i/2; jump>0; jump>>=1)
{
while (l+jump<i && s[l+jump].t<s[i].s)
l += jump;
}
dp[i] = dp[l] + s[i].e;
if (dp[i] < dp[i-1]) dp[i] = dp[i-1];
}
cout << dp[n];
}
```