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 ...
随机推荐
- PIE SDK热力图
1.算法功能简介 热力图,也就热图或者热点图,它能以特殊高亮的的形式显示某一区域的等级的优越性.重要性或者某一区域类别的密度和变换趋势:例如百度地图热力图 是用不同颜色的区块叠加在地图上实时描述人 ...
- 【Tensorflow】 Object_detection之准备数据生成TFRecord
参考:Preparing Inputs 1.PASCAL VOC数据集 数据集介绍: PASCAL Visual Object Classes 是一个图像物体识别竞赛,用来从真实世界的图像中识别特定对 ...
- c#委托、泛型、反射的使用情况
委托:当你传递的参数不是 变量 时,想把一个方法作为参数传递,此时委托就可以做到这点 泛型:当你传递的参数是一个类时,此时用泛型 反射:都说反射是一种耗时的操作,但是却很有用,所以反射他不是拿来滥用的 ...
- 使用params
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ife task0003学习笔记(四):JavaScript构造函数
JavaScript创建对象主要是3种方法:工厂模式.构造函数模式.原型模式.其实对于构造函数的概念,我们并不陌生.在之前学习c++语言的时候,也有提到过构造函数的概念.除了创建对象,构造函数(con ...
- 九度oj题目1165:字符串匹配
题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3078 解决:1079 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中 ...
- 通过TLS回调函数的反调试
下面是TLS数据结构的定义 typedef struct _IMAGE_TLS_DIRECTORY { DWORD StartAddressOfRawData; DWORD EndAddressOfR ...
- 自定义django admin及其界面
1.在项目目录下新创建一个app,命名为kingadmin,在templates目录下新建kingadmin目录,用来存放相关页面的模板文件,新建一个templatetags目录,用来存放处理前端模板 ...
- UML建模—EA创建Class(类图)
1.新建类图 2.添加类或接口 在类图可以捕获系统-类-和模型组件的逻辑结构.它是一个静态模型,描述存在什么,有哪些属性和行为,而不管如何去做. 说明关系之间的类和接口; 泛化. 聚合和关联是在分别反 ...
- 关于两个 IQueryable 合并
原先根据需求要对数据进行两种筛选,起初写过滤条件,但是过滤后发现有的数据重叠.因此改为查询两次. 因为查询后返回的是两个相同的.匿名的 IQueryable ,最终的目的是想两个 类型结合成一个. 参 ...