BZOJ4066:简单题(K-D Tree)
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
Solution
其他操作都是K-D Tree常规操作,唯一需要改改的就是查询的时候,
若当前KDT节点子树的矩形范围在查询范围外面就return
若当前KDT节点子树的矩形范围全在查询范围里面就统计子树答案return
记得判断一下查询的时候经过的叶子节点是否符合条件,符合则统计一下
Code
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N (200000+1000)
using namespace std; int n,opt,x,y,X[],Y[],k,D,Root,ans,lastans;
int stack[N],top,cnt;
double alpha=0.75; int NewNode()
{
if (top) return stack[top--];
return ++cnt;
} struct Node
{
int d[],Max[],Min[],lson,rson,sum,val,size;
bool operator < (const Node &a) const {return d[D]<a.d[D];}
Node (int x=,int y=,int z=)
{
d[]=x; d[]=y; lson=rson=; sum=val=z; size=;
Max[]=Min[]=d[]; Max[]=Min[]=d[];
}
}p[N]; struct KDT
{
Node Tree[N]; void Update(int now)
{
int ls=Tree[now].lson, rs=Tree[now].rson;
for (int i=; i<=; ++i)
{
Tree[now].Max[i]=Tree[now].Min[i]=Tree[now].d[i];
if (ls)
{
Tree[now].Max[i]=max(Tree[now].Max[i],Tree[ls].Max[i]);
Tree[now].Min[i]=min(Tree[now].Min[i],Tree[ls].Min[i]);
}
if (rs)
{
Tree[now].Max[i]=max(Tree[now].Max[i],Tree[rs].Max[i]);
Tree[now].Min[i]=min(Tree[now].Min[i],Tree[rs].Min[i]);
}
}
Tree[now].sum=Tree[ls].sum+Tree[rs].sum+Tree[now].val;
Tree[now].size=Tree[ls].size+Tree[rs].size+;
}
int Build(int opt,int l,int r)
{
if (l>r) return ;
int mid=(l+r)>>, now=NewNode();
D=opt; nth_element(p+l,p+mid,p+r+);
Tree[now]=p[mid];
Tree[now].lson=Build(opt^,l,mid-);
Tree[now].rson=Build(opt^,mid+,r);
Update(now); return now;
}
void Dfs(int now,int num)
{
int ls=Tree[now].lson, rs=Tree[now].rson;
if (ls) Dfs(ls,num);
p[num+Tree[ls].size]=Tree[now]; stack[++top]=now;
if (rs) Dfs(rs,num+Tree[ls].size+);
}
void Check(int &now,int opt)
{
int ls=Tree[now].lson, rs=Tree[now].rson;
if (Tree[ls].size>Tree[now].size*alpha || Tree[rs].size>Tree[now].size*alpha)
Dfs(now,), now=Build(opt,,Tree[now].size);
}
void Insert(int &now,int x,int opt)
{
if (now==){Root=x; return;}
if (Tree[x].d[opt]<=Tree[now].d[opt])
{
if (Tree[now].lson) Insert(Tree[now].lson,x,opt^);
else Tree[now].lson=x;
}
else
{
if (Tree[now].rson) Insert(Tree[now].rson,x,opt^);
else Tree[now].rson=x;
}
Update(now); Check(now,opt);
}
void Query(int now)
{
if (Tree[now].Max[]<X[] || Tree[now].Max[]<Y[] || Tree[now].Min[]>X[] || Tree[now].Min[]>Y[]) return;
if (Tree[now].Max[]<=X[] && Tree[now].Min[]>=X[] && Tree[now].Max[]<=Y[] && Tree[now].Min[]>=Y[])
{
ans+=Tree[now].sum;
return;
}
if (Tree[now].d[]<=X[] && Tree[now].d[]>=X[] && Tree[now].d[]<=Y[] && Tree[now].d[]>=Y[]) ans+=Tree[now].val;
if (Tree[now].lson) Query(Tree[now].lson);
if (Tree[now].rson) Query(Tree[now].rson);
}
}KDT; int main()
{
scanf("%d",&n);
while ()
{
scanf("%d",&opt);
if (opt==)
{
scanf("%d%d%d",&x,&y,&k);
x^=lastans; y^=lastans; k^=lastans;
int t=NewNode();
KDT.Tree[t]=Node(x,y,k);
KDT.Tree[t].size=;
KDT.Insert(Root,t,);
}
if (opt==)
{
scanf("%d%d%d%d",&X[],&Y[],&X[],&Y[]);
X[]^=lastans; Y[]^=lastans;
X[]^=lastans; Y[]^=lastans;
ans=;
KDT.Query(Root);
printf("%d\n",ans);
lastans=ans;
}
if (opt==) break;
}
}
BZOJ4066:简单题(K-D Tree)的更多相关文章
- [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 简单题(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- 简单题(K-D Tree)
简单题不简单-- 我们把单点加操作改成插入一个权值为增加量的点,将问题转化成询问一个矩阵中所有点的和,用 \(K-D\ Tree\) 维护,时间复杂度 \(O(n\sqrt{n})\) \(Code\ ...
- Luogu P4148 简单题(K-D Tree)
题面 题解 因为强制在线,所以我们不能$cdq$分治,所以考虑用$KDT$,$KDT$维护一个矩阵,然后询问的时候如果当前矩形在询问区间内,直接记贡献,否则判断当前点是否在矩阵内,然后左右分别递归下去 ...
- 【kd-tree】bzoj4066 简单题
同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...
- [bzoj4066/2683]简单题_KD-Tree
简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ...
- 【BZOJ4066】简单题(KD-Tree)
[BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...
随机推荐
- 4GLTE@NB-IOT
参考:https://www.cnblogs.com/pangguoming/p/9755916.html NB-IOT特点:在4G基础上发展而来,覆盖广,海量接入,成本低低功耗:不适合应用情况:大数 ...
- Unity 代码控制游戏对象是父物体的第多少个子对象
一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...
- (转) sync命令
sync sync命令 sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的 ...
- 水平垂直居中方案与flexbox布局
[前端攻略]最全面的水平垂直居中方案与flexbox布局 最近又遇到许多垂直居中的问题,这是Css布局当中十分常见的一个问题,诸如定长定宽或不定长宽的各类容器的垂直居中,其实都有很多种解决方案.而 ...
- SpringBoot | 第三十四章:CXF构建WebService服务
前言 上一章节,讲解了如何使用Spring-WS构建WebService服务.其实,创建WebService的方式有很多的,今天来看看如何使用apache cxf来构建及调用WebService服务. ...
- 【Ubuntu】Vritual Box 复制方式克隆
重装系统后之前安装的虚拟机的镜像全都不见了 ,因为重装系统盘C盘会全部重新被格式化. VtritualBox如果没有指定虚拟机存放位置,默认是会放在C盘的,C:\Users\Administrator ...
- Video标签事件与属性
事件与属性 属性 描述 audioTracks 返回可用的音轨列表(MultipleTrackList对象) autoplay 媒体加载后自动播放 buffered 返回缓冲部件的时间范围(TimeR ...
- java程序: 倒计时的小程序 (GridPane, Timer, Calendar, SimpleDateFormat ...)
倒计时程序 涉及到的东西: javafx简单的界面,布局,按钮,文本框,事件响应 java.util.Timer,用于定时 SimpleDateFormat用于在String和Date之间转换. ja ...
- [SQL SERVER系列]工作经常使用的SQL整理,实战篇(三)[原创]
工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇(三) 接着本系列前面两篇继续讨论. 有时 ...
- twaver拓扑图拖拽后保存json数据
功能描述:拓扑图.对节点进行拖拽,序列化获取拓扑图信息,保存到本地localStorage,刷新页面,执行反序列化,从本地获取之前保存的数据,展现之前拖拽后的拓扑 拓展:此处存储用的是web本地存储l ...