bzoj4066: 简单题

题目
k-d树
题解
注意:程序中的D是全局变量,用于排序中的比较

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200002;
int n,m,x,y,ans,opt,A,xx,yy,D,i;
inline char gc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline int read(){
    int x=0,fl=1;char ch=gc();
    for (;ch<48||ch>57;ch=gc())if(ch=='-')fl=-1;
    for (;48<=ch&&ch<=57;ch=gc())x=(x<<3)+(x<<1)+(ch^48);
    return x*fl;
}
inline void wri(int a){if(a>=10)wri(a/10);putchar(a%10|48);}
inline void wln(int a){if(a<0)a=-a,putchar('-');wri(a);puts("");}
inline void Min(int &x,int y){if (y<x) x=y;}
inline void Max(int &x,int y){if (y>x) x=y;}
struct P{
    int l,r,d[2],mn[2],mx[2],v,sum;
    int &operator[](int x){
        return d[x];
    }
    friend bool operator==(P a,P b){
        return a.d[0]==b.d[0] && a.d[1]==b.d[1];
    }
    friend bool operator<(P a,P b){
        return a[D]<b[D];
    }
}p[N];
bool in(int x1,int y1,int x2,int y2,int X1,int Y1,int X2,int Y2){
    return x1<=X1 && X2<=x2 && y1<=Y1 && Y2<=y2;
}
bool out(int x1,int y1,int x2,int y2,int X1,int Y1,int X2,int Y2){
    return X2<x1 || X1>x2 || Y2<y1 || Y1>y2;
}
struct node{
    P now,t[N];
    int rt,cnt;
    void update(int k){
        int l=t[k].l,r=t[k].r;
        for (int i=0;i<2;i++){
            t[k].mn[i]=t[k].mx[i]=t[k][i];
            if (l) Min(t[k].mn[i],t[l].mn[i]),Max(t[k].mx[i],t[l].mx[i]);
            if (r) Min(t[k].mn[i],t[r].mn[i]),Max(t[k].mx[i],t[r].mx[i]);
        }
        t[k].sum=t[k].v+t[l].sum+t[r].sum;
    }
    void ins(int &k,bool D){
        if (!k){
            k=++cnt;
            t[k][0]=t[k].mn[0]=t[k].mx[0]=now[0];
            t[k][1]=t[k].mn[1]=t[k].mx[1]=now[1];
        }
        if (now==t[k]){
            t[k].v+=now.v;t[k].sum+=now.v;
            return;
        }
        if (now[D]<t[k][D]) ins(t[k].l,D^1);
        else ins(t[k].r,D^1);
        update(k);
    }
    int query(int k,int x1,int y1,int x2,int y2){
        if (!k) return 0;
        int tmp=0;
        if (in(x1,y1,x2,y2,t[k].mn[0],t[k].mn[1],t[k].mx[0],t[k].mx[1])) return t[k].sum;
        if (out(x1,y1,x2,y2,t[k].mn[0],t[k].mn[1],t[k].mx[0],t[k].mx[1])) return 0;
        if (in(x1,y1,x2,y2,t[k][0],t[k][1],t[k][0],t[k][1])) tmp+=t[k].v;
        tmp+=query(t[k].l,x1,y1,x2,y2)+query(t[k].r,x1,y1,x2,y2);
        return tmp;
    }
    int build(int l,int r,bool f){
        if (l>r) return 0;
        int mid=l+r>>1;
        D=f;nth_element(p+l,p+mid,p+r+1);
        t[mid]=p[mid];
        t[mid].l=build(l,mid-1,f^1);
        t[mid].r=build(mid+1,r,f^1);
        update(mid);
        return mid;
    }
}T;
int main(){
    n=read();m=10000;
    while (1){
        opt=read();if (opt==3) break;
        x=read()^ans;y=read()^ans;
        if (opt==1){
            A=read()^ans;T.now[0]=x;T.now[1]=y;
            T.now.v=T.now.sum=A;
            T.ins(T.rt,0);
            if (T.cnt==m){
                for (i=1;i<=T.cnt;i++) p[i]=T.t[i];
                T.rt=T.build(1,T.cnt,0);m+=10000;
            }
        }else{
            xx=read()^ans;yy=read()^ans;
            wln(ans=T.query(T.rt,x,y,xx,yy));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80753664