CF 366E - Dima and Magic Guitar 最远曼哈顿距离

2024-05-28 04:48

本文主要是介绍CF 366E - Dima and Magic Guitar 最远曼哈顿距离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:http://codeforces.com/problemset/problem/366/E

其实就是找 n * m 矩阵中数字 x 和 数字 y 的最远距离。

方法参照武森的论文《浅谈信息学中的“0”和“1”》

先约定符号:xi,xj  (i,j)是x的下标,当然,矩阵中的值是可以重复的


上面是武森的论文原文,加上我之前的符号约定,我在做点解释:
其实那个max={四种可能}  更好的写法是:
|xi-yi|+|xj-yj|=max((1),(2),(3),(4))

(1)(xi+xj)-(yi+yj)   就是3-3  最大就是max3-min3

(2)(xi-xj)-(yi-yj)      2-2  最大就是max2-min2

(3)(-xi+xj)-(-yi+yj)  1-1  最大就是max1-min1

(4)(-xi-xj)-(-yi-yj)    0-0  最大就是max0-min0

那么维护数组num[v][4][2]    num[v][4][0]   就是0 1 2 3 情况下的最小值,num[v][4][1]   就是0 1 2 3 情况下的最大值,因为v可以出现在矩阵的多个位置就是说矩阵可以有重复值,所以维护的[0] [1]可能不是一个坐标处的,但是也是可以的

这么解释应该都能理解,然后如果是多维,不过是维护num[v][8][2]----剩下的,你懂得~~~

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const int INF = 100000000;
const double EPS = 1e-8;int ABS(int x)
{return x>=0?x:(-x);
}int a[10][4][2];
int n,m,k,s;int main()
{//IN("in.txt");int x,y;while(~scanf("%d%d%d%d",&n,&m,&k,&s)){for(int i=0;i<10;i++)for(int j=0;j<4;j++){a[i][j][0]=INF;//0  mina[i][j][1]=-INF;//1 max}//printf("cap\n");for(int i=0;i<n;i++)for(int j=0;j<m;j++){scanf("%d",&x);a[x][0][0]=min(a[x][0][0],-i-j);a[x][0][1]=max(a[x][0][1],-i-j);a[x][1][0]=min(a[x][1][0],-i+j);a[x][1][1]=max(a[x][1][1],-i+j);a[x][2][0]=min(a[x][2][0],i-j);a[x][2][1]=max(a[x][2][1],i-j);a[x][3][0]=min(a[x][3][0],i+j);a[x][3][1]=max(a[x][3][1],i+j);}int ans=0;scanf("%d",&x);for(int i=1;i<s;i++){scanf("%d",&y);for(int j=0;j<4;j++){ans=max(ans,ABS(a[x][j][1]-a[y][j][0]));ans=max(ans,ABS(a[x][j][0]-a[y][j][1]));}x=y;}printf("%d\n",ans);}return 0;
}



还看到另一种做法也是不错的:http://vawait.com/codeforces-366e/

其实道理一样

(1)(xi+xj)-(yi+yj)=xi+xj+(-yi-yj)   就是3+0  最大就是max3+max0

(2)(xi-xj)+(-yi+yj)      2+1  最大就是max2+max1

(3)(-xi+xj)+(yi-yj)  1+2  最大就是max1+max2

(4)(-xi-xj)+(yi+yj)    0+3  最大就是max0+max3

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define red(i, a, b) for (int i = (a); i >= (b); --i)
#define clr( x , y ) memset(x,y,sizeof(x))
#define sqr(x) ((x) * (x))
typedef long long lint;
int n,m,k,s,x,y,a[10][5];void init()
{scanf("%d%d%d%d",&n,&m,&k,&s);clr(a,243);rep(i,1,n)rep(j,1,m) {scanf("%d",&x);a[x][0] = max( a[x][0] , -i - j );a[x][1] = max( a[x][1] , -i + j );a[x][2] = max( a[x][2] , i - j );a[x][3] = max( a[x][3] , i + j );}
}void work()
{int ans = -100000000;scanf("%d",&x);rep(i,2,s) {scanf("%d",&y);rep(j,0,3) ans = max( ans , a[x][j] + a[y][3-j] );x = y;}cout<<ans;
}int main()
{init();work();return 0;
}


这篇关于CF 366E - Dima and Magic Guitar 最远曼哈顿距离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009585

相关文章

cf 164 C 费用流

给你n个任务,k个机器,n个任务的起始时间,持续时间,完成任务的获利 每个机器可以完成任何一项任务,但是同一时刻只能完成一项任务,一旦某台机器在完成某项任务时,直到任务结束,这台机器都不能去做其他任务 最后问你当获利最大时,应该安排那些机器工作,即输出方案 具体建图方法: 新建源汇S T‘ 对任务按照起始时间s按升序排序 拆点: u 向 u'连一条边 容量为 1 费用为 -c,

CF 508C

点击打开链接 import java.util.Arrays;import java.util.Scanner;public class Main {public static void main(String [] args){new Solve().run() ;} }class Solve{int bit[] = new int[608] ;int l

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数)

这题简直蛋疼死。。。。。 A了一下午 #include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn = 200005;int h,w,n;int C1[maxn],C2[maxn];int

【CF】E. Anya and Cubes(双向DFS)

根据题意的话每次递归分3种情况 一共最多25个数,时间复杂度为3^25,太大了 我们可以分2次求解第一次求一半的结果,也就是25/2 = 12,记录结果 之后利用剩余的一半求结果 s-结果 = 之前记录过的结果 就可以 时间复杂度降低为 3 ^ (n/2+1) 题目链接:http://codeforces.com/contest/525/problem/E #include<set

【CF】D. Arthur and Walls(BFS + 贪心)

D题 解题思路就是每次检查2X2的方格里是否只有一个‘*’,如果有的话这个*就需要变成‘.’,利用BFS进行遍历,入队的要求是这个点为. 一开始将所有的'.'全部加入队列,如果碰到一个'*'变成'.'就入队,判断的时候从4个方向就行判断 题目链接:http://codeforces.com/contest/525/problem/D #include<cstdio>#include<

模拟退火求n个点到某点距离和最短

/*找出一个点使得这个店到n个点的最长距离最短,即求最小覆盖圆的半径用一个点往各个方向扩展,如果结果更优,则继续以当前步长扩展,否则缩小步长*/#include<stdio.h>#include<math.h>#include<string.h>const double pi = acos(-1.0);struct point {double x,y;}p[1010];int

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

CF#271 (Div. 2) D.(dp)

D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/474/problem/D We s

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl