链接 1832: Jump
题意:有n个点,然后每次从一个点(x1,y1)跳到另一个点(x2,y2),并且 (x1, y1) —>(x2, y2) 只有满足 y1=y2 && x1
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
struct node{
int x,y,val,place;
node(int x_=0,int y_=0,int val_=0,int place_=0){
x=x_;
y=y_;
val=val_;
place=place_;
}
bool operator < (const node &t)const{
return (x<t.x)||(x==t.x&&y<t.y);
}
};
int n,b;
int st_x,st_y,la_x,la_y; //第一个点和最后一个点的坐标
node p[300005];
int max_x[100005],max_y[100005];//max_[i]用来保存横坐标为i这一行中最大的val值
int dp[300005];//dp[i]用来保存到达第i个点获得的最大能量
bool In(node p){//判断点p是否在第一个点和最后一个点的矩形内
if( p.x>=st_x&&p.y>=st_y&&p.x<=la_x&&p.y<=la_y) return true;
return false;
}
int main()
{
int t;
scanf ("%d",&t);
while (t--){
scanf ("%d%d",&n,&b);
int x,y,val;
memset (max_x,0,sizeof (max_x));//初始化
memset (max_y,0,sizeof (max_y));
memset (dp,0,sizeof (dp));
for (int i=0;i<n;i++){
scanf ("%d%d%d",&x,&y,&val);
p[i]=node(x,y,val,i);
}
st_x=p[0].x; st_y=p[0].y; //初始化第一个点和最后一个点
la_x=p[n-1].x; la_y=p[n-1].y;
max_x[p[0].x]=max_y[p[0].y]=dp[0]=p[0].val;//第一个点的val值和第一个点所在的坐标的值
sort(p,p+n);
for (int i=0;i<n;i++){
if (!In(p[i])) continue;//不在则跳过
if (p[i].x==st_x&&p[i].y==st_y)continue;
int tmp=max(max_x[p[i].x],max_y[p[i].y])-b;
if (tmp>=0){//判断能否跳跃
tmp+=p[i].val;
if (tmp>dp[p[i].place]) dp[p[i].place]=tmp;//更新
if (tmp>max_x[p[i].x]) max_x[p[i].x]=tmp;
if (tmp>max_y[p[i].y]) max_y[p[i].y]=tmp;
}
}
printf ("%d\n",dp[n-1]);
}
return 0;
}