BZOJ 2177 最小曼哈顿生成树

留板。

#include 
using namespace std;
typedef pair pii;
const int maxn=100005;
const long long inf=0x3f3f3f3f3f3f3f3f;
int n,pos[maxn],f[maxn];
long long bit[maxn],res,x,y;
struct edge {
    int u,v;
    long long w;
    edge(){}
    edge(int u,int v,int w):u(u),v(v),w(w){}
    bool operator<(const edge &rhs)const{
        return w v;
vector ID;
inline void init() {
    for (int i=0;iv) {
            bit[x]=v;
            pos[x]=p;
        }
        x-=x&-x;
    }
}
inline int query(int x) {
    long long val=inf;
    int ret=-1;
    while (x<=n) {
        if (bit[x]=0;--i) {
        int o=id(p[i].y-p[i].x);
        int t=query(o);
        if (t!=-1)
            v.push_back(edge(p[i].id,p[t].id,manh(i,t)));
        update(o,p[i].x+p[i].y,i);
    }
}
inline void build() {
    for (int i=0;i<4;++i) {
        if (i==1||i==3)
            for (int j=0;j>x>>y;
        p[i]=P(x,y,i);
    }
    build();
    kruskal();
    return 0;
}

你可能感兴趣的:(acm)