您的位置:首页 > 其它

莫队算法

2015-08-01 23:32 281 查看
转自 http://vawait.com/manhattanmst/
严谨的论文请看:戳这里或者戳这里,还有一个blog的也可以看看:戳这里

const int maxn = 100010;
int n , t , x , f[maxn] , c[maxn];

struct bit
{
int t[100100] , n;
void cl() { clr( t, 0 ); }
void add(int x,int y) {
for ( ; x; x -= x & (-x) ) if( c[y] < c[t[x]] ) t[x] = y;
}
int ask(int x) {
int s = 0;
for ( ; x <= 100000; x += x & (-x) ) if ( c[s] > c[t[x]] ) s = t[x];
return s;
}
} T;

struct nodd
{
int x , y , n;
} a[maxn] , d[maxn] , b[4*maxn];

bool cmp(nodd a,nodd b) { return a.x == b.x ? a.y < b.y : a.x < b.x; }

void add(int x,int y,int d)
{
b[++t].x = x; b[t].y = y;
b[t].n = d;
}

void init()
{
rep(i,1,n) scanf("%d%d",&a[i].x,&a[i].y) , a[i].n = i;
t = 0;
rep(k,1,4) {
if ( k == 2 || k == 4 ) rep(i,1,n) swap(a[i].x,a[i].y);
if ( k == 3 ) rep(i,1,n) a[i].x = -a[i].x;
sort( a + 1 , a + 1 + n , cmp );
rep(i,1,n) d[i].x = a[i].y - a[i].x , d[i].y = i;
rep(i,1,n) c[i] = a[i].x + a[i].y;
c[0] = 2000000000;
sort( d + 1 , d + 1 + n , cmp );
rep(i,1,n) f[d[i].y] = i;
T.cl();
red(i,n,1) {
if ( x = T.ask(f[i]) ) add( a[i].n , a[x].n , c[x] - c[i] );;
T.add(f[i],i);
}
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: