2019.08.20【NOIP提高组】模拟 B 组 排序、DP+递推、矩阵乘法+数位DP/类欧

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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值