当前位置: 首页 > news >正文

[BZOJ2850]巧克力王国

今天才学了一下kd-tree,感觉它本质上就是个暴力...

kd-tree用于维护高维空间中的一些点,它在建树时轮流在每一维坐标中选取中位数作为分割依据,最后形成一个树形结构

维护一个节点所管辖的坐标范围,然后查询就跟线段树差不多了

它维护$k$维空间时的范围查询时间复杂度是$O\left(kn^{1-\frac1k}\right)$,证明咕咕咕

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
struct candy{
	int x,y,h;
}d[50010];
struct kd{
	int l,r,mxx,mnx,mxy,mny,x,y,h;
	ll s;
	kd operator=(candy c){
		x=c.x;
		y=c.y;
		h=c.h;
		return*this;
	}
}t[50010];
bool cmpx(candy a,candy b){return a.x<b.x;}
bool cmpy(candy a,candy b){return a.y<b.y;}
void pushup(int x){
	t[x].mxx=t[x].mnx=t[x].x;
	t[x].mxy=t[x].mny=t[x].y;
	int l=t[x].l,r=t[x].r;
	if(l){
		t[x].mxx=max(t[x].mxx,t[l].mxx);
		t[x].mnx=min(t[x].mnx,t[l].mnx);
		t[x].mxy=max(t[x].mxy,t[l].mxy);
		t[x].mny=min(t[x].mny,t[l].mny);
	}
	if(r){
		t[x].mxx=max(t[x].mxx,t[r].mxx);
		t[x].mnx=min(t[x].mnx,t[r].mnx);
		t[x].mxy=max(t[x].mxy,t[r].mxy);
		t[x].mny=min(t[x].mny,t[r].mny);
	}
	t[x].s=t[l].s+t[r].s+t[x].h;
}
int build(int l,int r,int f){
	int mid=(l+r)>>1;
	nth_element(d+l,d+mid,d+r+1,f?cmpx:cmpy);
	t[mid]=d[mid];
	if(l<mid)t[mid].l=build(l,mid-1,f^1);
	if(mid<r)t[mid].r=build(mid+1,r,f^1);
	pushup(mid);
	return mid;
}
int a,b,c;
int check(ll x,ll y){return a*x+b*y<c;}
int check(kd u){return check(u.mnx,u.mny)+check(u.mxx,u.mny)+check(u.mnx,u.mxy)+check(u.mxx,u.mxy);}
ll query(int x){
	if(check(t[x])==4)return t[x].s;
	ll s=check(t[x].x,t[x].y)*t[x].h;
	if(check(t[t[x].l]))s+=query(t[x].l);
	if(check(t[t[x].r]))s+=query(t[x].r);
	return s;
}
int main(){
	int n,m,i,rt;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].h);
	rt=build(1,n,0);
	while(m--){
		scanf("%d%d%d",&a,&b,&c);
		printf("%lld\n",query(rt));
	}
}

转载于:https://www.cnblogs.com/jefflyy/p/9220011.html

相关文章:

  • 刚刚!“跨境汇款”被区块链重新定义,马云:源于多年前一个承诺
  • 大数据理论体系总结--数据仓库管理与全链路数据体系
  • 局域网大型文件分发的可能解决方案
  • 搭建视频监控平台《监视我的团宝宝》
  • BCH踏着优化升级路线,在数字货币界声名鹊起
  • Rust 1.27支持SIMD
  • 使用机器学习预测电子竞技游戏《守望先锋》的胜负
  • 技术团队管理笔记(二)-带人
  • 使用DeepLearning4j训练和保存模型
  • 爬取斗鱼图片
  • linux学习,网络故障排查
  • 微服务概念
  • 开发者论坛一周精粹(第四十八期) ICP经营许可证办理流程
  • 如何禁止JavaScript对象重写?
  • 收藏~软件测试相关工具汇总
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • IDEA 插件开发入门教程
  • Java应用性能调优
  • Laravel Telescope:优雅的应用调试工具
  • PAT A1017 优先队列
  • Promise面试题2实现异步串行执行
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何在 Tornado 中实现 Middleware
  • 数组的操作
  • 中文输入法与React文本输入框的问题与解决方案
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #include<初见C语言之指针(5)>
  • #微信小程序(布局、渲染层基础知识)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (Java)【深基9.例1】选举学生会
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)C#调用WebService 基础
  • **PHP二维数组遍历时同时赋值
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .Net6 Api Swagger配置
  • .NetCore项目nginx发布
  • ::
  • [ 数据结构 - C++]红黑树RBTree
  • [20150321]索引空块的问题.txt
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [c]统计数字
  • [hdu2196]Computer树的直径
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [IOI2007 D1T1]Miners 矿工配餐
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [json]定义、读写
  • [LeetCode][LCR190]加密运算——全加器的实现
  • [linux c]linux do_div() 函数用法