BZOJ4066 简单题(KD-Tree)
板子题。
#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)的更多相关文章
- BZOJ4066:简单题(K-D Tree)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...
- P4148 简单题 k-d tree
思路:\(k-d\ tree\) 提交:2次 错因:整棵树重构时的严重错误:没有维护父子关系(之前写的是假重构所以没有维护父子关系) 题解: 遇到一个新的点就插进去,如果之前出现过就把权值加上. 代码 ...
- [BZOJ2683][BZOJ4066]简单题
[BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...
- bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...
- 【kd-tree】bzoj4066 简单题
同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...
- bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...
- 初涉k-d tree
听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...
随机推荐
- php中addslashes(),htmlspecialchars()
参考转自http://czf2008700.blog.163.com/blog/static/2397283200937103250194/ addslashes -- 使用反斜线引用字符串 stri ...
- opencv---JPEG图像质量检测代码
参考:http://blog.csdn.net/trent1985/article/details/50904173 根据国外一篇大牛的文章:No-Reference Perceptual Quali ...
- 注冊成为Windows Phone开发人员而且解锁Windows Phone 8.1手机
注冊成为Windows Phone开发人员而且解锁Windows Phone 8.1手机 上篇文章介绍了怎样使用Qt Creator和Visual Studio构建Windows Phone 8.1应 ...
- 【webstorm】project目录树显示不出
问题原因:webstorm自动生成的配置文件 .idea/modules.xml损坏. 解决: 1.关掉webstorm: 2.删除该项目下的.idea文件夹(如果隐藏,请设置显示隐藏文件夹): 3. ...
- Ubuntu学习总结-01 安装Ubuntu
Ubuntu(友帮拓.优般图.乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球 ...
- Tomcat端口被占用解决方案
Tomcat端口被占用解决方法 1.在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程,显示占用端口的进程 2.taskkill /pid 19 ...
- 洛咕 P3704 [SDOI2017]数字表格
大力推式子 现根据套路枚举\(\gcd(i,j)\) \(ans=\Pi_{x=1}^nfib[x]^{\sum_{i=1}^{n/x}\sum_{j=1}^{n/x}[\gcd(i,j)=1]}\) ...
- REST-framework快速构建API--认证
一.API使用流程 使用过API的同学都知道,我们不可能任意调用人家的API,因为通过API可以获取很多关键数据,而且这个API可能供多个部门或个人使用,所以必须是经过授权的用户才能调用. API的使 ...
- KVM虚拟机管理——虚拟机创建和操作系统安装
1. 概述2. 交互式安装2.1 图形化-本地安装2.1.1 图形化本地CDROM安装2.2.2 图形化本地镜像安装2.2 命令行-本地安装2.2.1 命令行CDROM安装2.3 图形化-网络安装2. ...
- centos7 部署mysql-5.7.20
一.系统环境 系统:CentOS Linux release 7.5 mysqlb进制包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 1)依赖包安装 yum ...