BZOJ 4066 简单题 ——KD-Tree套替罪羊树
【题目分析】
直接x,y二维轮番划分,暴力即可。
套上替罪羊,打碎重构,对于时间复杂度有了保证。
写起来好麻烦,重构的技巧很棒!
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 200005
#define inf 0x3f3f3f3f
#define lim 0.7
#define L t[o].c[0]
#define R t[o].c[1]
#define mid (l+r>>1)
#define F(i,j,k) for (int i=j;i<=k;++i)
struct node{
int d[2],c[2];
int mx[2],mn[2],sum,v,siz,D;
int& operator [] (int x){return d[x];}
}t[maxn],now;
int p[maxn];
int opt=0,D,rt=0,ans=0,tot=0,cnt;
inline bool cmp(int x,int y){return t[x][D]<t[y][D];}
void pushup(int k)
{
for (int i=0;i<2;++i)
{
t[k].mn[i]=min(t[t[k].c[0]].mn[i],min(t[t[k].c[1]].mn[i],t[k].mn[i]));
t[k].mx[i]=max(t[t[k].c[0]].mx[i],max(t[t[k].c[1]].mx[i],t[k].mx[i]));
}
t[k].sum=t[t[k].c[0]].sum+t[t[k].c[1]].sum+t[k].v;
t[k].siz=t[t[k].c[0]].siz+t[t[k].c[1]].siz+1;
}
inline int build(int l,int r,int dir){
D=dir;
nth_element(p+l,p+mid,p+r+1,cmp);
int o=p[mid];
t[o].D=dir;
F(i,0,1) t[o].mn[i]=t[o].mx[i]=t[o][i];
t[o].sum=t[o].v;
L=l<mid ? build(l,mid-1,dir^1) : 0;
R=mid<r ? build(mid+1,r,dir^1) : 0;
pushup(o);
return o;
}
inline void dfs(int o){
if (!o) return;
dfs(L);
p[++cnt]=o;
dfs(R);
}
inline void rebuild(int &o){
cnt=0;
dfs(o);
o=build(1,cnt,t[o].D);
}
void ins(int &o,int dir)
{
if (!o)
{
o=++tot;
t[o]=now;
for (int i=0;i<2;++i) t[o].mn[i]=t[o].mx[i]=t[o].d[i];
t[o].siz=1;
t[o].D=dir;
t[o].sum=t[o].v;
return ;
}
if (now.d[dir]<t[o].d[dir])
{
ins(t[o].c[0],dir^1);
pushup(o);
if ((double)t[t[o].c[0]].siz>(double)t[o].siz*lim) rebuild(o);
}
else
{
ins(t[o].c[1],dir^1);
pushup(o);
if ((double)t[t[o].c[1]].siz>(double)t[o].siz*lim) rebuild(o);
}
}
void print(int o){
if (!o) return;
printf("%d t[o].mn[0]=%d t[o].mn[1]=%d t[o].mx[0]=%d t[o].mx[1]=%d\n",o,t[o].mn[0],t[o].mn[1],t[o].mx[0],t[o].mx[1]);
print(L);
print(R);
}
int query(int o,int x1,int y1,int x2,int y2)
{
if (!o) return 0;
if (t[o].mn[0]>=x1 && t[o].mn[1]>=y1 && t[o].mx[0]<=x2 && t[o].mx[1]<=y2)
return t[o].sum;
else
{
int ret=0;
if (t[o].d[0]>=x1&&t[o].d[0]<=x2&&t[o].d[1]>=y1&&t[o].d[1]<=y2)
ret+=t[o].v;
if (t[t[o].c[0]].mn[0]>x2||t[t[o].c[0]].mx[0]<x1||t[t[o].c[0]].mn[1]>y2||t[t[o].c[0]].mx[1]<y1);
else ret+=query(t[o].c[0],x1,y1,x2,y2);
if (t[t[o].c[1]].mn[0]>x2||t[t[o].c[1]].mx[0]<x1||t[t[o].c[1]].mn[1]>y2||t[t[o].c[1]].mx[1]<y1);
else ret+=query(t[o].c[1],x1,y1,x2,y2);
return ret;
}
}
int main()
{
for (int i=0;i<2;++i) t[rt].mx[i]=-inf,t[rt].mn[i]=inf;
t[rt].siz=t[rt].sum=t[rt].v=0;
scanf("%*d");
while (scanf("%d",&opt)!=EOF&&opt!=3)
{
if (opt==1)
{
scanf("%d%d%d",&now.d[0],&now.d[1],&now.v);
now.d[0]^=ans; now.d[1]^=ans; now.v^=ans;
ins(rt,1);
}
else{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1^=ans;y1^=ans;x2^=ans;y2^=ans;
printf("%d\n",ans=query(rt,x1,y1,x2,y2));
}
}
}
BZOJ 4066 简单题 ——KD-Tree套替罪羊树的更多相关文章
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- bzoj 4066 简单题——KDtree(带重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 带部分重构的KDtree.就是那个替罪羊树思想的. 写了对拍,调了半天,发现忘了 re ...
- 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次 错因:整棵树重构时的严重错误:没有维护父子关系(之前写的是假重构所以没有维护父子关系) 题解: 遇到一个新的点就插进去,如果之前出现过就把权值加上. 代码 ...
- BZOJ 4066 简单题(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
- bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...
- bzoj 4066: 简单题
#include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #d ...
- 【CJOJ2433】陌上花开 树状数组套替罪羊树
[CJOJ2433]陌上花开 树状数组套替罪羊树 蛤?bzoj?没权限QAQ 蛤?CDQ?看了好久没看懂QwQ 好吧我会拿cdq再写一遍的 为啥我感觉这东西比cdq好写 只好拿树状数组套替罪羊树水水了 ...
随机推荐
- jcFeather Maya 羽毛插件
jcFeather 2.8.6 插件持续更新地址为:http://www.jerrykon.com/jcFeather.html 和 http://www.creativecrash.com/maya ...
- CSS3使用Font Awesome字体图标的控件样例(按钮,工具栏,输入框)
按钮上加入font awesome图标,用原生的input button标签无法实现,查看网上的只能通过<a><li></li></a>实现此功能,通过 ...
- $q -- AngularJS中的服务(理解)
描述 译者注: 看到了一篇非常好的文章,如果你有兴趣,可以查看: Promises与Javascript异步编程 , 里面对Promises规范和使用情景,好处讲的非常好透彻,个人觉得简单易懂. ...
- bzoj3744 Gty的妹子序列
我是萌萌的传送门 感觉这题还是不错的--虽然其实算是比较水的题= = 首先分块,令f[i][j]表示第i块到第j块的逆序对数,询问的时候直接计算不完整块与完整块以及不完整块之间的逆序对. 不完整块之间 ...
- js 对数据转换成数据容量单位
function bytesToSize(value) { alert(value); alert('value'); debugger; if (value === 0) return '0 B'; ...
- php关于ob_start('ob_gzhandler')启用GZIP压缩的bug
如果使用ob_start("ob_gzhandler"); 则ob_clean()后面的输出将不显示,这是个bug,可以用ob_end_clean();ob_start(" ...
- ORA-00257:archiver error解决办法
出现ORA-00257错误(空间不足错误),通过查找资料,绝大部分说这是由于归档日志太多,占用了全部的硬盘剩余空间导致的,通过简单删除日志或加大存储空间就能够解决. (一).oralce 11g更改归 ...
- Linux 搭建Java web服务器
未经允许,不得转载 1.jdk的下载与配置 1.1下载 sudo wget http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45- ...
- MySql卸载重新安装出现Start service没有响应的解决办法(64位)
昨天因为自己手欠,不小心把mysql卸载了,于是又得重新安装,但是每次到了最后一步就报没有响应,于是就去寻找解决办法,如下就是啦! 安装Mysql卸载后又重新安装,每次到最后Start service ...
- 【Django】--ModelForm组件
ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...