题目叙述
http://codeforces.com/problemset/problem/366/E
其实就是找 n * m 矩阵中数字 x 和 数字 y 的最远距离。
算法
n * m 的。不知道 cf 上面那些人为啥都好慢。。。
这题说白了就是求最远哈密顿距离。那为啥不用武森的论文呢。
http://www.cppblog.com/sonicmisora/archive/2009/09/14/96143.aspx
枚举每个点,然后用 4 进制分别记录 -i-j , -i+j , i-j , i+j 的最大值和最小值。
然后枚举 9 * 9 看看哪两个相邻的,枚举4进制d,求距离最大值 max 就可以了。
Code
http://codeforces.com/contest/366/submission/5228621
const int N = 2009;
int n , m , k , s , a[N][N];
int l[10][4] , r[10][4];
int b[200000];
bool p[10][10];
int main(){
cin >> n >> m >> k >> s;
for (int i = 0; i < 10 ; ++i)
for (int j = 0 ; j < 4 ; ++j){
l[i][j] = INF;
r[i][j] = -INF;
}
for (int i= 0 ; i < n ; ++i)
for (int j = 0 ; j < m ; ++j){
RD(a[i][j]);
checkMax(r[a[i][j]][0] , -i - j);
checkMin(l[a[i][j]][0] , -i - j);
checkMax(r[a[i][j]][1] , i - j);
checkMin(l[a[i][j]][1] , i - j);
checkMax(r[a[i][j]][2] , -i + j);
checkMin(l[a[i][j]][2] , -i + j);
checkMax(r[a[i][j]][3] , i + j);
checkMin(l[a[i][j]][3] , i + j);
}
for (int i = 0 ; i < s ; ++i){
RD(b[i]);
if (i){
p[b[i]][b[i - 1]] = 1;
p[b[i - 1]][b[i]] = 1;
}
}
int ans = 0;
for (int i = 1 ; i <= 9 ; ++i)
for (int j = 1 ; j <= 9 ; ++j) if (p[i][j]){
for (int d = 0 ; d < 4 ; ++d){
checkMax(ans , abs(l[i][d] - r[j][d]));
checkMax(ans , abs(r[i][d] - l[j][d]));
}
}
OT(ans);
}
还是太弱了 1、今天发现长沙的 D 题,裸抄个模板就过了。。。后悔 2、今天发现长沙的 H 题,当时思路是对的,写残了认为思路错了,就没管。。呵呵。。 3、10mins看 E + 过 E 。 虽然一开始算法是 81nmlog(nm) 也给过了。。1628ms 4、还是太弱了,退役了之后无心打比赛,大一学弟AK 了div2.唉,一朝不做题,回到解放前。
const int N = 2009;
int n , m , k , s , a[N][N];
int l[10][4] , r[10][4];
int b[200000];
bool p[10][10];
int main(){
cin >> n >> m >> k >> s;
for (int i = 0; i < 10 ; ++i)
for (int j = 0 ; j < 4 ; ++j){
l[i][j] = INF;
r[i][j] = -INF;
}
for (int i= 0 ; i < n ; ++i)
for (int j = 0 ; j < m ; ++j){
RD(a[i][j]);
checkMax(r[a[i][j]][0] , -i - j);
checkMin(l[a[i][j]][0] , -i - j);
checkMax(r[a[i][j]][1] , i - j);
checkMin(l[a[i][j]][1] , i - j);
checkMax(r[a[i][j]][2] , -i + j);
checkMin(l[a[i][j]][2] , -i + j);
checkMax(r[a[i][j]][3] , i + j);
checkMin(l[a[i][j]][3] , i + j);
}
for (int i = 0 ; i < s ; ++i){
RD(b[i]);
if (i){
p[b[i]][b[i - 1]] = 1;
p[b[i - 1]][b[i]] = 1;
}
}
int ans = 0;
for (int i = 1 ; i <= 9 ; ++i)
for (int j = 1 ; j <= 9 ; ++j) if (p[i][j]){
for (int d = 0 ; d < 4 ; ++d){
checkMax(ans , abs(l[i][d] - r[j][d]));
checkMax(ans , abs(r[i][d] - l[j][d]));
}
}
OT(ans);
}
还是太弱了 1、今天发现长沙的 D 题,裸抄个模板就过了。。。后悔 2、今天发现长沙的 H 题,当时思路是对的,写残了认为思路错了,就没管。。呵呵。。 3、10mins看 E + 过 E 。 虽然一开始算法是 81nmlog(nm) 也给过了。。1628ms 4、还是太弱了,退役了之后无心打比赛,大一学弟AK 了div2.唉,一朝不做题,回到解放前。