文章目录
0 旅游(travel)
ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼。终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历。
ztxz16生活的城市有NM个景点,可以描述成一个NM的矩形,每个景点有一个坐标(x, y) (1 <= x <= N, 1 <= y <= M)以及美观度A[x][y]和观赏所需的时间B[x][y],从一个景点(x1, y1)走到另一个景点(x2, y2)需要时间为它们之间的曼哈顿距离:|x1 - x2| +|y1 - y2|。
为了防止审美疲劳,ztxz16希望观赏的景点的的美观度是严格上升的,由于不想太早回家码代码,ztxz16希望旅游的总时间尽可能长。
对于30%的数据:1<=N<=50 , 1<=M<=50
对于60%的数据:1<=N<=300 , 1<=M<=300
对于100%的数据:1<=N<=1000 , 1<=M<=1000
0<=A[x][y]<=1000000
0<=B[x][y]<=10^9
注意:本题输入数据较大,请注意输入消耗的时间
因为矩阵的坐标对浏览的顺序没有影响而美观度才是有影响,所以用美观度排序,按美观度的顺序随便dp
(然而这样可以过似乎是因为数据水)
(正解好像还要四边形不等式优化?)
我,差点就可以A过,但是我用了堆排,每次都要删删减减那种,就T飞了
然而并不需要堆,因为没有插入操作
//#pragma GCC optimize(3)
//#pragma GCC optimize(2)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1000006;
int n,m,cnt;
long long ans;
unsigned int a[1003][1003];
long long f[N];
struct cv{
int w,x,y;
long long f;
}b[N];
inline int read(){
char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
int x=0;
while (ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
inline int abs(int a){
return (a>0?a:-a);
}
bool comp(cv a,cv b){
return a.w<b.w;
}
int main(){
n=read();m=read();
for (register int i=1;i<=n;i++){
for (register int j=1;j<=m;j++){
a[i][j]=read();
}
}
for (regi