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好写 只好拿树状数组套替罪羊树水水了 ...
随机推荐
- C# 深入浅出 异步(八)
C#异步调用学习链接:从C#5.0说起:再次总结C#异步调用方法发展史
- 通过代码自定义cell(cell的高度不一致,比如微博)
1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 (先要调用父控件的nitWithStyle:reuseIdentifie ...
- 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理
题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...
- AngularJs:Service、Factory、Provider依赖注入使用与区别
本教程使用AngularJS版本:1.5.3 AngularJs GitHub: https://github.com/angular/angular.js/ ...
- CentOS最常用命令及快捷键整理
CentOS最常用命令及快捷键整理 整理了Linux常用命令及快捷键. 常用命令: 文件和目录: # cd /home 进入 '/home' 目录 # ...
- 菜鸟笔记:javascript基础之表达式和运算符
4.1 原始表达式 原始表达式是最简单的表达式~它不再包含其他表达式.它包含:直接量(程序中直接显示出来的数据值.)常量(程序中不会被修改的量)变量. 4.2 对象和数组的初始化表达式 对象和数组初始 ...
- [原创]zepto打造一款移动端划屏插件
最近忙着将项目内的jquery 2换成zepto 因为不想引用过多的zepto包,所以花了点时间 zepto真的精简了许多,源代码看着真舒服 正好项目内需要一个划屏插件,就用zepto写了一个 逻辑其 ...
- required - HTML5里的input标签的required属性提示文字修改
input 里面增加这样的语句: <input type="text" placeholder="您的姓名" required oninvalid=&qu ...
- $.extend()和 $.fn.extend()
1 $.extend() jQuery.extend(): Merge the contents of two or moreobjects together into the first ...
- python之路十二
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...