bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066
https://www.lydsy.com/JudgeOnline/problem.php?id=2683
高仿:https://www.cnblogs.com/Narh/p/9605505.html
注意细节...
AC 300 ~
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=2e5+5;
double const alpha=0.75;
int n,cnt,sta[xn],top,rt,dm,c[xn][2],qx1,qx2,qy1,qy2;
int R,fa,son,num;
ll ans;
struct N{
int x[2],y[2],p[2],siz;
ll sum,ys;
}t[xn],a[xn];
int rd()
{
int ret=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}
while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
return f?ret:-ret;
}
ll Abs(ll x){return x>0?x:-x;}
ll Min(ll x,ll y){return x<y?x:y;}
ll Max(ll x,ll y){return x<y?y:x;}
bool cmp(N x,N y){return x.p[dm]<y.p[dm];}
int node(){if(top)return sta[top--]; else return ++cnt;}
void turn(int x,N v)
{
for(int i=0;i<2;i++)t[x].x[i]=t[x].y[i]=t[x].p[i]=v.p[i];
t[x].ys=t[x].sum=v.ys; t[x].siz=1; c[x][0]=0; c[x][1]=0;//ys //c //v.ys!!!
}
void pushup(int x)
{
int ls=c[x][0],rs=c[x][1];
for(int i=0;i<2;i++)
{
if(ls)t[x].x[i]=Min(t[x].x[i],t[ls].x[i]),t[x].y[i]=Max(t[x].y[i],t[ls].y[i]);
if(rs)t[x].x[i]=Min(t[x].x[i],t[rs].x[i]),t[x].y[i]=Max(t[x].y[i],t[rs].y[i]);
}
t[x].sum=t[x].ys+(ls?t[ls].sum:0)+(rs?t[rs].sum:0);
t[x].siz=1+(ls?t[ls].siz:0)+(rs?t[rs].siz:0);
}
bool ck(int x)
{
int ls=c[x][0],rs=c[x][1];
return (ls&&t[ls].siz>t[x].siz*alpha)||(rs&&t[rs].siz>t[x].siz*alpha);
}
void ins(int &x,N v,int nw)
{
if(!x){x=node(); turn(x,v); return;}
if(v.p[nw]<=t[x].p[nw])ins(c[x][0],v,nw^1);
else ins(c[x][1],v,nw^1);
pushup(x);
if(ck(x))R=x,dm=nw;
if(R==c[x][0])fa=x,son=0; if(R==c[x][1])fa=x,son=1;
}
bool can(int x)
{return t[x].p[0]>=qx1&&t[x].p[0]<=qx2&&t[x].p[1]>=qy1&&t[x].p[1]<=qy2;}
bool in(int x)
{return t[x].x[0]>=qx1&&t[x].y[0]<=qx2&&t[x].x[1]>=qy1&&t[x].y[1]<=qy2;}
bool out(int x)
{return t[x].x[0]>qx2||t[x].y[0]<qx1||t[x].x[1]>qy2||t[x].y[1]<qy1;}
ll query(int x)
{
if(can(x))ans+=t[x].ys;//ys
int ls=c[x][0],rs=c[x][1];
if(ls)
{
if(in(ls))ans+=t[ls].sum;
else if(!out(ls))query(ls);
}
if(rs)
{
if(in(rs))ans+=t[rs].sum;
else if(!out(rs))query(rs);
}
}
void kill(int x)
{
sta[++top]=x; a[++num]=t[x];
if(c[x][0])kill(c[x][0]);
if(c[x][1])kill(c[x][1]);
}
void build(int &x,int l,int r,int nw)
{
x=node(); dm=nw; int mid=((l+r)>>1);
nth_element(a+l,a+mid,a+r+1,cmp);
turn(x,a[mid]);
if(mid>l)build(c[x][0],l,mid-1,nw^1);
if(mid<r)build(c[x][1],mid+1,r,nw^1);
pushup(x);
}
void rbuild(int x)
{
num=0; kill(x); int mid=((1+num)>>1);
nth_element(a+1,a+mid,a+num+1,cmp);
int p=node(); turn(p,a[mid]);
if(fa)c[fa][son]=p; else rt=p;//
if(mid>1)build(c[p][0],1,mid-1,dm^1);
if(mid<num)build(c[p][1],mid+1,num,dm^1);
pushup(p);
}
int main()
{
n=rd(); N tmp;
while((n=rd())!=3)
{
if(n==1)
{
//tmp.p[0]=(rd()^ans); tmp.p[1]=(rd()^ans); tmp.ys=(rd()^ans);
tmp.p[0]=rd(); tmp.p[1]=rd(); tmp.ys=rd();
fa=0; ins(rt,tmp,0);//fa
}
else
{
//qx1=(rd()^ans); qy1=(rd()^ans);
//qx2=(rd()^ans); qy2=(rd()^ans);
qx1=rd(); qy1=rd(); qx2=rd(); qy2=rd();
ans=0; query(rt); printf("%lld\n",ans);
}
if(R){if(R==rt)fa=0; rbuild(R); R=0;}
}
return 0;
}
bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)的更多相关文章
- BZOJ 2683 简单题 cdq分治+树状数组
		
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
 - BZOJ 2683: 简单题
		
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
 - bzoj 1176: [Balkan2007]Mokia&&2683: 简单题  -- cdq分治
		
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
 - [bzoj4066/2683]简单题_KD-Tree
		
简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ...
 - P5057 [CQOI2006]简单题(线段树)
		
果然简单题,5分钟紫题++ 代码 #include <cstdio> #include <algorithm> #include <cstring> using n ...
 - BZOJ 2683: 简单题(CDQ分治 + 树状数组)
		
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
 - BZOJ 2683: 简单题 [CDQ分治]
		
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
 - BZOJ 4066 简单题(KD树)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
 - BZOJ 2683: 简单题(CDQ 分治)
		
题面 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...
 
随机推荐
- 信息搜集之google语法
			
总结的比较全,无耻的转了.D: http://blog.csdn.net/chaosa/article/details/1828301 说起Google,可谓无人不知无人不晓.作为世界第一的搜索引擎, ...
 - Delphi编译指令说明
			
Delphi快速高效的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有时也需要对编译器进行必要的设置. ******** ...
 - C#DataSet/DataAdapter
			
DataReader必须持续连接,所以在调用方法SqlDataReader作为返回类型时候,必须在方法外关闭流,很不方便. DataAdapter用于对数据源检索数据并填充到DataSet中的表.Da ...
 - 【leetcode刷题笔记】Evaluate Reverse Polish Notation
			
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
 - nova 为何要做互信
			
1.计算节点为什么要做nova 的互信? nova 做resize 或者冷迁移需要两台计算节点做互信. 原因:resize(冷迁移)实际上是运行scp 文件到另一台主机上,如下的命令 Command: ...
 - nginx 搭建虚拟主机
			
一.排错三部曲 第一步在客户端上ping服务端ip ping 10.0.0.8 第二部在客户端上telnet服务器端IP.端口 telnet 10.0.0.8 第三部在客户端使用wget命令检测 ...
 - Android平台及其架构(部分转载)
			
一.Android的系统架构 1. 应用程序 同Android系统一起发布的核心应用程序,如email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等. 这些应用程序都是用 ...
 - castle windsor学习-----XML Inline Parameters 内联参数
			
当使用XML配置的时候,可能要给组件指定各种各样的依赖 1.简单的参数 参数名称不区分大小写 <component id="ping" type="Acme.Crm ...
 - Linux开发引导
			
1.应用程序目录 /bin 用于存放启动系统时用到的程序 /usr/bin 用于存放用户使用的标准程序 /usr/local/bin 用于存放软件安装的程序 /sbin:/usr/sbin 用于存放系 ...
 - JAVAScript中DOM与BOM的差异分析
			
JAVAScript 有三部分构成,ECMAScript,DOM和BOM,根据浏览器的不同,具体的表现形式也不尽相同.我们今天来谈一谈DOM和BOM这俩者之间的差异. 用百科上的来说: 1. DOM是 ...