板子题。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
#define ll long long
#define N 200010
#define inf 2000000000
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,root,cnt,c,ans,t,tot,id[N];
const double alpha=0.75;
struct point
{
int d[],v;
bool operator <(const point&a) const
{
return d[c]<a.d[c];
}
}a[N];
struct KDTree{int ch[],a[][],size,sum;point p;
}tree[N];
inline bool isin(point p,int a[][]){return p.d[]>=a[][]&&p.d[]<=a[][]&&p.d[]>=a[][]&&p.d[]<=a[][];}
inline bool isin(int a[][],int b[][]){return a[][]>=b[][]&&a[][]<=b[][]&&a[][]>=b[][]&&a[][]<=b[][];}
inline bool iscross(int a[][],int b[][]){return max(a[][],b[][])<=min(a[][],b[][])&&max(a[][],b[][])<=min(a[][],b[][]);}
void newnode(int k,point p)
{
tree[k].size=,tree[k].sum=p.v,tree[k].p=p;
tree[k].a[][]=tree[k].a[][]=p.d[],tree[k].a[][]=tree[k].a[][]=p.d[];
lson=rson=;
}
void get(int k)
{
if (lson) get(lson);
t++,id[t]=k,a[t]=tree[k].p;
if (rson) get(rson);
}
void build(int &k,int l,int r,int op)
{
if (l>r) return;
c=op;
int mid=l+r>>;
nth_element(a+l,a+mid,a+r+);
newnode(k=id[++tot],a[mid]);
for (int i=l;i<=r;i++)
tree[k].a[][]=min(tree[k].a[][],a[i].d[]),tree[k].a[][]=max(tree[k].a[][],a[i].d[]),
tree[k].a[][]=min(tree[k].a[][],a[i].d[]),tree[k].a[][]=max(tree[k].a[][],a[i].d[]);
build(lson,l,mid-,op^),build(rson,mid+,r,op^);
tree[k].size+=tree[lson].size,tree[k].size+=tree[rson].size,
tree[k].sum+=tree[lson].sum,tree[k].sum+=tree[rson].sum;
}
void rebuild(int &k,int op)
{
t=;get(k);
tot=;build(k,,t,op);
}
void ins(int &k,point p,int op)
{
if (!k) {newnode(k=++cnt,p);return;}
if (max(tree[lson].size,tree[rson].size)>tree[k].size*alpha) rebuild(k,op);
tree[k].size++;tree[k].sum+=p.v;
tree[k].a[][]=min(tree[k].a[][],p.d[]),tree[k].a[][]=max(tree[k].a[][],p.d[]);
tree[k].a[][]=min(tree[k].a[][],p.d[]),tree[k].a[][]=max(tree[k].a[][],p.d[]);
if (tree[k].a[op][]<=p.d[]) ins(lson,p,op^);
else ins(rson,p,op^);
}
int query(int k,int a[][])
{
if (!k) return ;
if (isin(tree[k].a,a)) return tree[k].sum;
return (isin(tree[k].p,a)?tree[k].p.v:)+
(iscross(tree[lson].a,a)?query(lson,a):)+
(iscross(tree[rson].a,a)?query(rson,a):);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4066.in","r",stdin);
freopen("bzoj4066.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
read();int op=read();
while (op<)
{
if (op==)
{
int x=read()^ans,y=read()^ans,z=read()^ans;
ins(root,(point){{x,y},z},);
}
else
{
int a[][];a[][]=read()^ans,a[][]=read()^ans,a[][]=read()^ans,a[][]=read()^ans;
printf("%d\n",ans=query(root,a));
}
op=read();
}
return ;
}

BZOJ4066 简单题(KD-Tree)的更多相关文章

  1. BZOJ4066:简单题(K-D Tree)

    Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:   命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...

  2. P4148 简单题 k-d tree

    思路:\(k-d\ tree\) 提交:2次 错因:整棵树重构时的严重错误:没有维护父子关系(之前写的是假重构所以没有维护父子关系) 题解: 遇到一个新的点就插进去,如果之前出现过就把权值加上. 代码 ...

  3. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  4. bzoj4066: 简单题 K-Dtree

    bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...

  5. Bzoj4066 简单题

    Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 2185  Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...

  6. bzoj 4066: 简单题 K-D树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...

  7. 【kd-tree】bzoj4066 简单题

    同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...

  8. bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...

  9. 初涉k-d tree

    听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...

随机推荐

  1. Android动态的全屏和退出全屏

    转自:http://chroya.iteye.com/blog/974031 让程序全屏的方法,大家都知道,那是静态的,程序运行之初就申明了.但是如果有这样的需求:要在程序运行的过程中,执行了某个操作 ...

  2. java中线程的几种状态和停止线程的方法

    1.线程的状态图 需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态 2.停止线程的两种方法 1)自然停止:线程体自然执行完毕 2)外部干涉:通过线程体标识 1.线程类中定义线程 ...

  3. neo4j----创建索引

    创建索引 create index on:Student(name) 删除索引 drop index on:Student(name) 创建唯一索引 create constraint on (s:T ...

  4. php实现远程网络文件下载到服务器指定目录(方法一)

    PHP实现远程网络文件下载到服务器指定目录(方法一) <?php function getFile($url, $save_dir = '', $filename = '', $type = 0 ...

  5. Newtonsoft.Json.Linq对象读取DataSet数据

    Newtonsoft.Json.Linq对象读取DataSet数据: private void button4_Click(object sender, EventArgs e)        {   ...

  6. excel的宏与VBA入门(三)——流程控制

    一.条件控制IF if 逻辑表达式 then 语句块 end if 带else的if语句: If 逻辑表达式1 Then 语句块1 ElseIf 逻辑表达式2 Then 语句块2 ElseIf 逻辑表 ...

  7. springboot整合redis——redisTemplate的使用

    一.概述 相关redis的概述,参见Nosql章节 redisTemplate的介绍,参考:http://blog.csdn.net/ruby_one/article/details/79141940 ...

  8. Caffe源码中common文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp.blob.hpp等或者外部调用Caffe库使用时,一般都会in ...

  9. libgdx退出对话框

    package com.fxb.newtest; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; i ...

  10. JS设置状态栏

    JS设置状态栏可通过window.status = str来设置,在后台可通过 ClientScript.RegisterStartupScript( this.GetType(), "12 ...