题目链接:点击这里
解题思路:
用y从小到到排序,y相等的按x从大到小排序,那么我用x做树状数组维护前缀最大值,因为经过这样排序之后,i前面所有的点y都是递增的,所以可以直接取前缀最大就行了。
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define lowbit(x) x&(-x)
const int mod = 1e9+7;
const int mx = 1e5+5;
typedef long long ll;
int x[mx];
int n;
ll sum[mx];
void add(int p,ll x){
while(p<=n){
sum[p] = max(sum[p],x);
p += lowbit(p);
}
}
ll query(int p){
ll ans = 0;
while(p){
ans = max(ans,sum[p]);
p -= lowbit(p);
}
return ans;
}
struct node{
int x,y;
ll w;
bool operator<(const node &a)const{
if(y != a.y) return y < a.y;
return x > a.x;
}
}a[mx];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d%d%lld",&a[i].x,&a[i].y,&a[i].w);
x[i] = a[i].x;
sum[i] = 0;
}
sort(a+1,a+n+1);
sort(x+1,x+n+1);
ll res = 0;
for(int i = 1; i <= n; i++){
int k = lower_bound(x+1,x+n+1,a[i].x)-x;
ll ans = a[i].w+query(k-1);
add(k,ans);
res = max(ans,res);
}
printf("%lld\n",res);
}
return 0;
}