【BZOJ】【4066】简单题(强制在线)
KD-Tree
KD-Tree的进阶姿势戳这里 http://zyfzyf.is-programmer.com/posts/92431.html
为啥有种线段树&平衡树的即视感……(树形结构的相似性?)
每次插入之后,判断下如果某个子树的size>父亲size*0.7,那么重构一下……(替罪羊树的即视感)
查询的时候,如果当前点表示的坐标范围被查询范围完全包含,则直接返回sum;
否则:当前点若在范围内则更新答案,左子树若不全在范围外则递归进入查询,右子树同理(线段树的即视感)
TLE:rebuild的时候,我没清当前点的min和max就直接build子树&Push_up(o)了……活该跪……
UPD:2015-05-23 17:20:26
今天看论文的时候,发现这一做法在陈老师的论文中已经讲出来了……orz,无限ym陈老师!
/**************************************************************
Problem: 4066
User: Tunix
Language: C++
Result: Accepted
Time:28400 ms
Memory:11444 kb
****************************************************************/ //BZOJ 4066
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,INF=1e9;
/*******************template********************/
int n,m,ans,D,cnt,p[N],tot,root;
struct node{
int d[],mn[],mx[],l,r,D,size,sum,v;
int& operator [] (int x){return d[x];}
}t[N],now;
inline bool cmp(int x,int y){return t[x][D]<t[y][D];} #define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
inline void Push_up(int o){
F(i,,){
t[o].mn[i]=min(t[o].mn[i],min(t[L].mn[i],t[R].mn[i]));
t[o].mx[i]=max(t[o].mx[i],max(t[L].mx[i],t[R].mx[i]));
}
t[o].sum=t[L].sum+t[R].sum+t[o].v;
t[o].size=t[L].size+t[R].size+;
}
inline int build(int l,int r,int dir){
D=dir;
nth_element(p+l,p+mid,p+r+,cmp);
int o=p[mid];
t[o].D=dir;
F(i,,) t[o].mn[i]=t[o].mx[i]=t[o][i];
t[o].sum=t[o].v;
L=l<mid ? build(l,mid-,dir^) : ;
R=mid<r ? build(mid+,r,dir^) : ;
Push_up(o);
return o;
}
inline void dfs(int o){
if (!o) return;
dfs(L);
p[++cnt]=o;
dfs(R);
}
inline void rebuild(int &o){
cnt=;
dfs(o);
o=build(,cnt,t[o].D);
}
inline void Insert(int &o,int dir){
if (!o){
o=++tot; t[o]=now;
F(i,,) t[o].mn[i]=t[o].mx[i]=t[o][i];
t[o].D=dir;
t[o].size=;
t[o].sum=t[o].v;
return;
}
if (now[dir]<t[o][dir]){
Insert(L,dir^);
Push_up(o);
if ((double)t[L].size>(double)t[o].size*0.7) rebuild(o);
}
else{
Insert(R,dir^);
Push_up(o);
if ((double)t[R].size>(double)t[o].size*0.7) rebuild(o);
}
}
int query(int o,int x1,int y1,int x2,int y2){
if (!o) return ;
if (t[o].mn[]>=x1 && t[o].mn[]>=y1 && t[o].mx[]<=x2 && t[o].mx[]<=y2)
return t[o].sum;
else{
int ans=;
if (t[o][]>=x1 && t[o][]<=x2 && t[o][]>=y1 && t[o][]<=y2) ans+=t[o].v;
if (t[L].mn[]>x2 || t[L].mx[]<x1 || t[L].mn[]>y2 || t[L].mx[]<y1) ;
else ans+=query(L,x1,y1,x2,y2);
if (t[R].mn[]>x2 || t[R].mx[]<x1 || t[R].mn[]>y2 || t[R].mx[]<y1) ;
else ans+=query(R,x1,y1,x2,y2);
return ans;
}
}
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[],t[o].mn[],t[o].mx[],t[o].mx[]);
print(L);
print(R);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("4066.in","r",stdin);
freopen("4066.out","w",stdout);
#endif
F(i,,) t[].mn[i]=INF,t[].mx[i]=-INF;
t[].size=t[].sum=t[].v=; n=getint(); int cmd;
while(scanf("%d",&cmd)!=EOF && cmd<){
if (cmd==){
now[]=getint()^ans,now[]=getint()^ans,now.v=getint()^ans;
Insert(root,);
}else{
int x1=getint()^ans,y1=getint()^ans,x2=getint()^ans,y2=getint()^ans;
printf("%d\n",ans=query(root,x1,y1,x2,y2));
}
}
return ;
}
4066: 简单题
Time Limit: 50 Sec Memory Limit: 20 MB
Submit: 297 Solved: 99
[Submit][Status][Discuss]
Description
|
命令 |
参数限制 |
内容 |
|
1 x y A |
1<=x,y<=N,A是正整数 |
将格子x,y里的数字加上A |
|
2 x1 y1 x2 y2 |
1<=x1<= x2<=N 1<=y1<= y2<=N |
输出x1 y1 x2 y2这个矩形内的数字和 |
|
3 |
无 |
终止程序 |
Input
Output
Sample Input
1 2 3 3
2 1 1 3 3
1 1 1 1
2 1 1 0 7
3
Sample Output
5
HINT
Source
【BZOJ】【4066】简单题(强制在线)的更多相关文章
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- BZOJ 4066 简单题(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
- bzoj 4066 简单题——KDtree(带重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 带部分重构的KDtree.就是那个替罪羊树思想的. 写了对拍,调了半天,发现忘了 re ...
- bzoj 4066: 简单题 K-D树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4066 题解 我们把每次的修改操作都当作二维平面上多了一个权值点 对于每组询问可以看做求一 ...
- BZOJ 4066 简单题 ——KD-Tree套替罪羊树
[题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...
- bzoj 4066: 简单题
#include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #d ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- BZOJ 3687: 简单题 bitset
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...
- bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
随机推荐
- JAVAEE——宜立方商城05:前台系统搭建、首页展示、Cms系统的实现
1. 学习计划 1.前台系统搭建 2.商城首页展示 3.Cms系统的实现 a) 内容分类管理 b) 内容管理 4.前台内容动态展示 2. 商城首页展示 系统架构: 页面位置: 2.1. 工程搭建 可以 ...
- CentOS7配置ssh证书登录无效
今天配置A服务器使用root用户ssh免密登录服务器B,配置过程很简单,由于这两台服务器开发人员之前生成过证书,我就直接在A服务器执行如下命令即可 # ssh-copy-id -i ~/.ssh/id ...
- DNS隧道工具iodine
DNS隧道工具iodine 在受限制的网络中,如果DNS请求没有被限制,就可以通过DNS请求建立隧道而突破网络限制.iodine是Kali Linux提供的一款DNS隧道工具.该工具分为服务器端i ...
- 深入理解ajax系列第七篇
前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...
- [ 原创 ] Java基础3--Java中的接口
一.使用接口(interface)的目的 Java只支持单继承,即一个类最多只能继承一个直接父类,接口的主要功能就是可以实现类似于类的多重继承的功能. 二.接口的性质 1.接口具有继承性,即子接口可继 ...
- Winform 串口通讯之地磅
继上次的读卡之后,要做一个地磅的读取. 下面是我在读卡Demo上改的读取地磅的. 地磅是一直向串口发送数据的,所以需要截取数据来一直判断数据是否合法,然后计算出结果. 其中遇到了一个小问题,文末有介绍 ...
- [BZOJ1758][WC2010]重建计划(点分治+单调队列)
点分治,对于每个分治中心,考虑求出经过它的符合长度条件的链的最大权值和. 从分治中心dfs下去取出所有链,为了防止两条链属于同一个子树,我们一个子树一个子树地处理. 用s1[i]记录目前分治中心伸下去 ...
- 2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)
贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- Codeforces Round #259 (Div. 1) A. Little Pony and Expected Maximum 数学公式结论找规律水题
A. Little Pony and Expected Maximum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...