bzoj千题计划148:bzoj1537: [POI2005]Aut- The Bus(棋盘DP)

http://www.lydsy.com/JudgeOnline/problem.php?id=1537

 

朴素的转移:dp[i][j]=max(dp[i][j-1],dp[i-1][j])+p[i][j]

树状数组优化

按x排序,离散化y

枚举,排序保证x,树状数组查询y

 

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

#define N 100001

#define lowbit(x) x&-x

int c[N];

struct node
{
    int x,y,p;
}e[N];

int tot,has[N];

void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c))  c=getchar(); 
    while(isdigit(c)) { x=x*10+c-'0'; c=getchar();  }
}

void change(int x,int y)
{
    while(x<=tot)
    {
        c[x]=max(c[x],y);
        x+=lowbit(x);
    }
}

int query(int x)
{
    int mx=0;
    while(x)
    {
        mx=max(mx,c[x]);
        x-=lowbit(x);
    }
    return mx;
}

bool cmp(node p,node q)
{
    if(p.y!=q.y) return p.y<q.y;
    return p.x<q.x;
}

int main()
{
    int n,m,k;
    read(n); read(m); read(k);
    for(int i=1;i<=k;++i)
    {
        read(e[i].x);
        read(e[i].y);
        read(e[i].p);
        has[i]=e[i].x;
    }
    sort(has+1,has+k+1);
    tot=unique(has+1,has+k+1)-has-1;
    sort(e+1,e+k+1,cmp);
    int tmp,pos; int ans=0;
    for(int i=1;i<=k;++i)
    {
        pos=lower_bound(has+1,has+tot+1,e[i].x)-has;
        tmp=e[i].p+query(pos);
        ans=max(ans,tmp);
        change(pos,tmp);
    }
    cout<<ans;
}

 

posted @ 2017-12-19 09:52  TRTTG  阅读(303)  评论(0编辑  收藏  举报