题目: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 min
a[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 最远曼哈顿距离的更多相关文章

  1. CF 366E Dima and Magic Guitar(最远哈密顿距离)

    题目链接:http://codeforces.com/problemset/problem/366/E 题意:给出一个n*m的数字矩阵A,每个矩阵元素的范围[1,K].给出一个长度为s的数字串B,B的 ...

  2. cf E. Dima and Magic Guitar

    http://codeforces.com/contest/366/problem/E |x1-x2|+|y1-y2|有四种情况 1.-(x1-x2)+(y1-y2); 2.(x1-x2)-(y1-y ...

  3. Dima and Magic Guitar CodeForces - 366E

    Dima and Magic Guitar CodeForces - 366E 题意: http://blog.csdn.net/u011026968/article/details/38716425 ...

  4. hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  5. poj 2926:Requirements(最远曼哈顿距离,入门题)

    Requirements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3908   Accepted: 1318 Desc ...

  6. POJ-2926 Requirements 最远曼哈顿距离

    题目链接:http://poj.org/problem?id=2926 题意:求5维空间的点集中的最远曼哈顿距离.. 降维处理,推荐2009武森<浅谈信息学竞赛中的“0”和“1”>以及&l ...

  7. [HDU 4666]Hyperspace[最远曼哈顿距离][STL]

    题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...

  8. HDU 4666 Hyperspace (最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  9. HDU 4666 最远曼哈顿距离

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4666 关于最远曼哈顿距离的介绍: http://blog.csdn.net/taozifish/ar ...

随机推荐

  1. taro 在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头

    在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头.否则会报错 错误写法: // 真实路径 import MinaMask from '../../components/ ...

  2. js 暂时性死区

    1.概念 在代码块内,使用let.const命令声明变量之前,该变量都是不可用的.这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ). 2.注意 “暂时性死区”也意味 ...

  3. svn 和 git的区别

    1.速度: 克隆一份全新的目录,以同样拥有五个(才五个)分支来说,SVN是同时复製5个版本的文件,也就是说重复五次同样的动作.而Git只是获取文件的每个版本的元素,然后只载入主要的分支(master) ...

  4. windows命令:control命令

    Windows的命令列模式下有个非常好用的命令叫做Control.这个命令其实就是控制『控制台』的一个接口.你可以用这个命令直接叫起一些平常要找很久才会找到的窗口.最简单的一个例子,你只要在『开始』 ...

  5. Unity3D - 资源管理

    一直没有总结过Unity的资源管理,都是随用随看文档.今天有人问起,总结一下.加深对Unity资源管理的理解. 主要參考了Unity官方文档之Resources和AssetBundle. Unity有 ...

  6. spring mvc json的输入输出

    输入 前台代码: var cfg = { type: 'POST', data: JSON.stringify({userName:'winzip',password:'password',mobil ...

  7. map函数原理

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #map函数 #map函数会对一个序列对象中的每一个元素应用被传入的函数,并返回一个包含了所有函数调用结果的一 ...

  8. C语言第一个例子hello world

    1.用文本编辑器编辑代码如下,然后保存为hello.c文件 #include <stdio.h> int main(void){ printf("hello world" ...

  9. 通俗的理解HTTPS以及SSL中的证书验证

    一.HTTPS的安全性体现在哪 HTTP(超文本传输协议,Hyper Text Transfer Protocol)是我们浏览网站信息传输最广泛的一种协议.HTTPS(Hyper Text Trans ...

  10. HDUOJ-----1541 Stars

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...