hdu6447 离散+树状数组

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>


using namespace std;
typedef long long LL;
const int maxn=1e5+5;
int N,tree[maxn],a[maxn],U;
struct DM
{
    int x,y,val;
}num[maxn];
bool cmp(DM a,DM b)
{
    if(a.x==b.x)return a.y>b.y;
    return a.x<b.x;
}
void update(int i,int x)
{
    while(i<=U)
    {
        tree[i]=max(tree[i],x);
        i+=(i&-i);
    }
}
int query(int i)
{
    int sum=0;
    while(i)
    {
        sum=max(sum,tree[i]);
        i-=(i&-i);
    }
    return sum;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        for(int i=1;i<=N;i++)
        {
            scanf("%d%d%d",&num[i].x,&num[i].y,&num[i].val);
            a[i]=num[i].y;
        }
        sort(a+1,a+1+N);
        sort(num+1,num+1+N,cmp);
        U=unique(a+1,a+1+N)-a-1;
        memset(tree,0,sizeof(tree));
        int ans=0;
        for(int i=1;i<=N;i++)
        {
            int k=lower_bound(a+1,a+1+U,num[i].y)-a;
            int res=query(k-1)+num[i].val;
            ans=max(ans,res);
            update(k,res);
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41646772/article/details/82431180