题目描述

巧克力王国里的巧克力都是由牛奶和可可做成的。但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力。对于每一块巧克力,我们设x和y为其牛奶和可可的含量。由于每个人对于甜的程度都有自己的评判标准,所以每个人都有两个参数a和b,分别为他自己为牛奶和可可定义的权重,因此牛奶和可可含量分别为x和y的巧克力对于他的甜味程度即为ax + by。而每个人又有一个甜味限度c,所有甜味程度大于等于c的巧克力他都无法接受。每块巧克力都有一个美味值h。现在我们想知道对于每个人,他所能接受的巧克力的美味值之和为多少

输入

第一行两个正整数n和m,分别表示巧克力个数和询问个数。接下来n行,每行三个整数x,y,h,含义如题目所示。再接下来m行,每行三个整数a,b,c,含义如题目所示。

输出

输出m行,其中第i行表示第i个人所能接受的巧克力的美味值之和。

样例输入

3 3
1 2 5
3 1 4
2 2 1
2 1 6
1 3 5
1 3 7

样例输出

5
0
4


题解

KD-tree

朴素的n^2暴力显然会TLE,我们来优化这个过程。

题目要求出某条直线下方的所有点的权值和,不过看做直线并没有什么用。

考虑,如果能够使得某一些点都符合条件或都不符合条件,那么就可以降低查找的时间。

所以我们使用KD-tree来维护平面上的点。查询时,判断一下区域内的点是否都满足条件或都不满足条件,可以减去大量时间。

不过时间复杂度上界貌似还是O(n^2)的

估价函数需要分4种情况讨论

#include <cstdio>
#include <algorithm>
#define N 50010
using namespace std;
typedef long long ll;
struct data
{ll p[2] , v , maxn[2] , minn[2] , sum;int c[2];
}a[N];
int d , root;
bool cmp(data a , data b)
{return a.p[d] == b.p[d] ? a.p[d ^ 1] < b.p[d ^ 1] : a.p[d] < b.p[d];
}
void pushup(int k , int x)
{a[k].maxn[0] = max(a[k].maxn[0] , a[x].maxn[0]);a[k].maxn[1] = max(a[k].maxn[1] , a[x].maxn[1]);a[k].minn[0] = min(a[k].minn[0] , a[x].minn[0]);a[k].minn[1] = min(a[k].minn[1] , a[x].minn[1]);a[k].sum += a[x].sum;
}
int build(int l , int r , int now)
{int mid = (l + r) >> 1;d = now , nth_element(a + l , a + mid , a + r + 1 , cmp);a[mid].maxn[0] = a[mid].minn[0] = a[mid].p[0];a[mid].maxn[1] = a[mid].minn[1] = a[mid].p[1];a[mid].sum = a[mid].v;if(l < mid) a[mid].c[0] = build(l , mid - 1 , now ^ 1) , pushup(mid , a[mid].c[0]);if(r > mid) a[mid].c[1] = build(mid + 1 , r , now ^ 1) , pushup(mid , a[mid].c[1]);return mid;
}
int getdis(int k , ll x , ll y , ll z)
{if(x >= 0 && y >= 0){if(x * a[k].maxn[0] + y * a[k].maxn[1] < z) return 1;if(x * a[k].minn[0] + y * a[k].minn[1] >= z) return -1;}else if(x < 0 && y >= 0){if(x * a[k].minn[0] + y * a[k].maxn[1] < z) return 1;if(x * a[k].maxn[0] + y * a[k].minn[1] >= z) return -1;}else if(x >= 0 && y < 0){if(x * a[k].maxn[0] + y * a[k].minn[1] < z) return 1;if(x * a[k].minn[0] + y * a[k].maxn[1] >= z) return -1;}else{if(x * a[k].minn[0] + y * a[k].minn[1] < z) return 1;if(x * a[k].maxn[0] + y * a[k].maxn[1] >= z) return -1;}return 0;
}
ll query(int k , ll x , ll y , ll z)
{int t = getdis(k , x , y , z);if(t == 1) return a[k].sum;if(t == -1) return 0;ll ans = 0;if(a[k].p[0] * x + a[k].p[1] * y < z) ans += a[k].v;if(a[k].c[0]) ans += query(a[k].c[0] , x , y , z);if(a[k].c[1]) ans += query(a[k].c[1] , x , y , z);return ans;
}
int main()
{int n , m , i;ll x , y , z;scanf("%d%d" , &n , &m);for(i = 1 ; i <= n ; i ++ ) scanf("%lld%lld%lld" , &a[i].p[0] , &a[i].p[1] , &a[i].v);root = build(1 , n , 0);while(m -- ) scanf("%lld%lld%lld" , &x , &y , &z) , printf("%lld\n" , query(root , x , y , z));return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7110220.html

【bzoj2850】巧克力王国 KD-tree相关推荐

  1. [bzoj2850]巧克力王国_KD-Tree

    巧克力王国 bzoj-2850 题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c.求所有ax+by<=c的巧克 ...

  2. bzoj 2850 巧克力王国 —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询: 要注意值有负,所以不是直 ...

  3. K-D Tree学习笔记

    引入 K-D Tree 是一种处理高维空间的数据结构. 支持O(nk−1k)O(n^{\frac {k-1}k})O(nkk−1​)查询给定超矩形内的点的信息, kkk 为维数. 可以用替罪羊树的思想 ...

  4. [学习笔记] 乱世之神杀疯了 —— K-D tree

    文章目录 K-D tree 建树 合并 插入 删除 查询(估价函数) 旋转坐标系 题目练习 [SDOI2012]最近最远点对 [Violet]天使玩偶/SJY摆棋子 [CQOI2016]K远点对 [国 ...

  5. 巧克力王国 BZOJ 2850

    巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...

  6. PCL :K-d tree 2 结构理解

    K-d tree 基础思路:(先看之前的KNN思想,更容易理解) 导语:kd 树是一种二叉树数据结构,可以用来进行高效的 kNN 计算.kd 树算法偏于复杂,本篇将先介绍以二叉树的形式来记录和索引空间 ...

  7. PCL:k-d tree 1 讲解

    1.简介 kd-tree简称k维树,是一种空间划分的数据结构.常被用于高维空间中的搜索,比如范围搜索和最近邻搜索.kd-tree是二进制空间划分树的一种特殊情况.(在激光雷达SLAM中,一般使用的是三 ...

  8. k-d tree算法的研究

    By RaySaint 2011/10/12 动机 先前写了一篇文章<SIFT算法研究>讲了讲SIFT特征具体是如何检测和描述的,其中也提到了SIFT常见的一个用途就是物体识别,物体识别的 ...

  9. k-d tree树 近邻算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

最新文章

  1. git rm -r --cached 去掉已经托管在git上的文件
  2. 由mysql8降级到mysql5
  3. vs 2010 不显示解决方案文件
  4. angularjs directive scope变化为啥html,学习AngularJs:Directive指令用法(完整版)
  5. vs2013 git 使用总结
  6. Git for Windows 国内下载站
  7. ios上input框上边有阴影
  8. 报错,npm ERR! code ENOLOCAL
  9. zookeeper和eureka的对比
  10. 桥接设计模式(Bridge)
  11. android asset jar,android离线打包 可以使用,但总是报错 android_asset/null
  12. MP3 功能原理 及 软件方案设计(一)
  13. 航迹推演通过左右轮速度得到机器人前进线速度和角速度
  14. 响铃和振动(转载的)
  15. matlab polyfit c语言,算法——纯C语言最小二乘法曲线拟合
  16. ubuntu安装极点五笔输入法
  17. Java方法的案例:求和、判断奇偶数、求最值
  18. 基于MATLAB的线激光三维彩色扫描仪
  19. 极海APM微控制器基于IAR开发环境搭建与工程调试配置方法
  20. 【SRIO】6、Xilinx RapidIO核仿真与包时序分析

热门文章

  1. php百度人脸识别做登陆,php调用百度人脸识别接口查询数据库人脸信息实现验证登录功能...
  2. apk ionic 破损_cordova – ionic build android不生成任何.apk文件或错误
  3. sql server express 并发数的限制_阿里数据库性能诊断的利器——SQL执行干预
  4. 一台古老电脑之维修记
  5. 小编带你了解oracle使用索引和不使用索引性能分析
  6. 朱峰谈概念设计(八):电影中的概念设计
  7. 引领三消新模式 《梦幻花园》商业化分析
  8. 游戏编程设计模式——Game Loop
  9. %date:~0,10%用法
  10. 参数NLS_LENGTH_SEMANTICS的设置问题