zoukankan      html  css  js  c++  java
  • 洛谷 P4148 简单题 KD-Tree 模板题

    Code:

    //洛谷 P4148 简单题 KD-Tree 模板题 
    
    
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    void setIO(string a){ freopen((a+".in").c_str(),"r",stdin);}
    
    #define maxn 500007
    
    int root,d,tot;
    struct Data
    {
        int ch[2],sum,w,minv[2],maxv[2],p[2];
    }node[maxn];
    bool cmp(Data i,Data j)
    {
        return i.p[d] == j.p[d]? i.p[d^1] < j.p[d^1]: i.p[d]<j.p[d];
    }
    bool isout(int k,int x1,int y1,int x2,int y2)
    {
        if(node[k].maxv[0]<x1||node[k].minv[0]>x2||node[k].maxv[1]<y1||node[k].minv[1]>y2) return 1;
        return 0;
    }
    bool isin(int k,int x1,int y1,int x2,int y2)
    {
        if(node[k].maxv[0]<=x2 && node[k].minv[0]>=x1 && node[k].maxv[1]<=y2 && node[k].minv[1]>=y1) return 1;
        return 0;
    }
    void pushup(int x,int o)
    {
        node[x].minv[0]=min(node[x].minv[0],node[o].minv[0]);
        node[x].maxv[0]=max(node[x].maxv[0],node[o].maxv[0]);
        node[x].minv[1]=min(node[x].minv[1],node[o].minv[1]);
        node[x].maxv[1]=max(node[x].maxv[1],node[o].maxv[1]);
        node[x].sum+=node[o].sum;
    }
    int build(int l,int r,int o)
    {
        int mid=(l+r)>>1;
        d=o, nth_element(node + l, node + mid, node + r + 1, cmp);
        node[mid].minv[0] = node[mid].maxv[0] = node[mid].p[0];
        node[mid].minv[1] = node[mid].maxv[1] = node[mid].p[1];
        node[mid].sum = node[mid].w;
        node[mid].ch[0]=node[mid].ch[1]=0;
        if(l < mid) node[mid].ch[0] = build(l, mid-1, o^1), pushup(mid, node[mid].ch[0]);
        if(r > mid) node[mid].ch[1] = build(mid + 1, r , o^1), pushup(mid, node[mid].ch[1]); 
        return mid; 
    }
    int query(int k,int x1,int y1,int x2,int y2)
    {
        if(!k||isout(k,x1,y1,x2,y2)) return 0;
        if(isin(k,x1,y1,x2,y2)) return node[k].sum;
        int ans=0;
        if(x1<=node[k].p[0]&&x2>=node[k].p[0]&&y1<=node[k].p[1]&&y2>=node[k].p[1]) ans+=node[k].w;
        ans+=query(node[k].ch[0],x1,y1,x2,y2)+query(node[k].ch[1],x1,y1,x2,y2);
        return ans;
    }
    void insert(int x)
    {
        int *t = &root;
        d = 0;
        while(*t) pushup(*t , x) , t = &node[*t].ch[ node[x].p[d] > node[*t].p[d] ] , d ^= 1;
        *t = x;
    }
    int main()
    {
        //setIO("input");
        int n,lastans=0,opt;
        scanf("%d",&n);
        while(1)
        {
            scanf("%d",&opt);
            if(opt == 1) 
            {
                int x,y,a;
                scanf("%d%d%d",&x,&y,&a),x^=lastans,y^=lastans,a^=lastans;
                ++tot;
                node[tot].p[0]=x,node[tot].p[1]=y;
                node[tot].maxv[0]=node[tot].minv[0]=x;
                node[tot].maxv[1]=node[tot].minv[1]=y;
                node[tot].w=node[tot].sum=a;
                insert(tot);
                if(tot%10000==0) root=build(1,tot,0);
            }
            if(opt == 2)
            {
                int x1,y1,x2,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2),x1^=lastans,y1^=lastans,x2^=lastans,y2^=lastans;
                lastans=query(root,x1,y1,x2,y2);
                printf("%d
    ",lastans);
            }
            if(opt == 3) break;
        }
        return 0;
    }
    

      

  • 相关阅读:
    文件系统操作与磁盘管理
    文件打包与压缩
    环境变量与文件查找
    Linux 目录结构及文件基本操作
    用户及文件权限管理
    基本概念及操作
    iOS 一个简单的单例
    Xcode编译Undefined symbols for architecture xxx 错误总结
    iOS 直播
    iOS8.1 编译ffmpeg和集成第三方实现直播(监控类)
  • 原文地址:https://www.cnblogs.com/guangheli/p/10104904.html
Copyright © 2011-2022 走看看