[POI2005]AUT-The Bus

题目

Sample Input 1

8 7 11
4 3 4
6 2 4
2 3 2
5 6 1
2 5 2
1 5 5
2 1 1
3 1 1
7 7 1
7 4 2
8 6 2


Sample Output 1

11


思路

$$DP[y_j]=\max(DP[1...y_j])+p_j$$.

道理我都懂,可是线段树空间要开4倍😢

#include<bits/stdc++.h>
const int SIZE=200005;

int n,m,k,Tem[SIZE],Tot,DP[SIZE],Ans;
struct Stop
{
int X,Y,P;
bool operator <(const Stop &o)const
{
if(X!=o.X)return X<o.X;
return Y<o.Y;
}
}A[SIZE];

struct Seg_Tree
{
int Max[SIZE*4];
#define LC(x) (x<<1)
#define RC(x) (x<<1|1)
#define Mid ((L+R)>>1)
void push_up(int x){Max[x]=std::max(Max[LC(x)],Max[RC(x)]);}
void Change(int p,int L,int R,int X,int K)
{
if(L==R){Max[p]=K;return;}
if(X<=Mid)Change(LC(p),L,Mid,X,K);
else Change(RC(p),Mid+1,R,X,K);
push_up(p);
}
int Query_max(int p,int L,int R,int X,int Y)
{
if(L>Y||R<X)return 0;
if(L>=X&&R<=Y)return Max[p];
return std::max(Query_max(LC(p),L,Mid,X,Y),Query_max(RC(p),Mid+1,R,X,Y));
}
}T;

int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&A[i].X,&A[i].Y,&A[i].P);
Tem[++Tot]=A[i].X;
Tem[++Tot]=A[i].Y;
}
std::sort(Tem+1,Tem+1+Tot);
for(int i=1;i<=k;i++)
{
A[i].X=std::lower_bound(Tem+1,Tem+1+Tot,A[i].X)-Tem;
A[i].Y=std::lower_bound(Tem+1,Tem+1+Tot,A[i].Y)-Tem;
}
std::sort(A+1,A+1+k);
for(int i=1;i<=k;i++)
{
if(A[i].Y==1)DP[A[i].Y]=std::max(DP[A[i].Y],A[i].P);
else DP[A[i].Y]=std::max(DP[A[i].Y],T.Query_max(1,1,Tot,1,A[i].Y-1))+A[i].P;
T.Change(1,1,Tot,A[i].Y,DP[A[i].Y]);
Ans=std::max(Ans,DP[A[i].Y]);
}
printf("%d",Ans);
return 0;
}

posted @ 2019-11-01 08:03  TaylorSwift13  阅读(164)  评论(0编辑  收藏  举报