前面已经分析过,并且用线段树写过。树状数组对单点更新更快,所以.....
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <time.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
#define Lson l,m,rt<<1
#define Rson m+1,r,rt<<1|1
int n;
int bit[maxn];
int lowbit(int x) {return x&-x;}
void updata(int x,int v)
{
for(int i=x;i<maxn;i+=lowbit(i))
{
bit[i]=max(bit[i],v);
}
}
int query(int x)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
{
ans=max(ans,bit[i]);
}
return ans;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T;
cin>>T;
while(T--)
{
scanf("%d",&n);
memset(bit,0,sizeof(bit));
vector<tuple<int,int ,int> > vec;//tuple类似结构体
vector<int> v;
v.push_back(-1);
for(int i=1,x,y,w;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&w);
vec.emplace_back(x,-y,w);//将y变成负值,是懒得写cmp函数,因为默认按从小到大排序,其实需要的是从大到小
v.push_back(y);
}
sort(vec.begin(),vec.end());
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
//unique()函数将重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器 再用erase函数擦除从这个元素到最后元素的所有的元素
int x,y,z,ans=0;
for(auto &t: vec)
{
tie(x,y,z)=t;//tie创建元组
y=-y;
int tmp;
int pos=lower_bound(v.begin(),v.end(),y)-v.begin();
if(pos<1) tmp=z;
else tmp=query(pos-1)+z;
updata(pos,tmp);
ans=max(ans,tmp);
}
printf("%d\n",ans);
}
return 0;
}