最远曼哈顿距离小结 poj 2926 Requirements&hdu 4666 Hyperspace

首先对于两点(x1,y1),(x2,y2)二维的曼哈顿距离为|x1-x2|+|y1-y2|
将绝对值去掉,再将同一点的坐标归于一处可得四种情况:
1.x1-x2+y1-y2->(x1+y1)-(x2+y2)
2.x2-x1+y1-y2->(-x1+y1)-(-x2+y2)
3.x1-x2+y2-y1->(x1-y1)-(x2-y2)
4.x2-x1+y2-y1->(-x1-y1)-(-x2-y2)
在右边式子中可以发现左半部分和右半部分的符号完全相同.
我们假设0代表’+’,1代表’-‘,则有
00 01 10 11.
这里和容斥原理中求区间和给点数互质个数时的二进制枚举没有任何差别.
我们可以处理处一个点所有的axi+byi的情况,若维数为k,易知有2^k种.
而最大距离必定在一个点和另一个点的2^k种情况下差值的最大值中形成.
静态:
v[i][j]: 第i个数的第j中状态
Double get(int n,int K)
{
for(int i=0;ia) a=v[i][j];
                if(v[i][j]ans) ans=a-b;
       }
}
 
 
动态:
struct st
{
   int a[6],b[35];
}s[maxn];
结构体保存每个点的维数距离(a),处理出来的状态(b)
multiset data[35];
data动态维护,对每一组状态保存一个域,里面存所有点
work每次处理处所有的状态,add为增加一个点,del为删除一个点
void work(int id)
{
   for(int i=0;i<(1<ans) ans=a-b;
    }
}

poj2926
#include 
#include 
#define inf 999999999999999
using namespace std;
double v[35][100010];
double a[6];
int n;
//const double inf=1000000000;
int main()
{
    double sum;
    while(~scanf("%d",&n))
    {
        for(int i=0;ia) a=v[i][j];
                if(v[i][j]ans) ans=a-b;
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

hdu 4666
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=60010;
struct st
{
    int a[6],b[35];
}s[maxn];
multiset data[35];
int n,k;
const int inf=1000000000;
void work(int id)
{
    for(int i=0;i<(1<ans) ans=a-b;
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}


你可能感兴趣的:(曼哈顿距离,poj,ACM,hdu)