巧克力王国 bzoj-2850

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

注释:$1\le n,n\le 5\cdot 10^4$。


想法:我们将巧克力的两个参数分别当作它的横纵坐标,然后对于每一次询问就可以转化成查询给定直线下的点的点权和。

对于这个问题,我们可以建立KD-Tree解决。

估价函数就是看这个矩形是不是都选或者都不选,否则的话,就遍历这个矩形。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50010
using namespace std;
typedef long long ll;
int d,root;
struct Node
{ll c[2],p[2],maxn[2],minn[2],v,sum;
}a[N];
inline bool cmp(const Node &x,const Node &y)
{return x.p[d]==y.p[d]?x.p[d^1]<y.p[d^1]:x.p[d]<y.p[d];
}
inline void pushup(int k,int s)
{a[k].maxn[0]=max(a[k].maxn[0],a[s].maxn[0]);a[k].minn[0]=min(a[k].minn[0],a[s].minn[0]);a[k].maxn[1]=max(a[k].maxn[1],a[s].maxn[1]);a[k].minn[1]=min(a[k].minn[1],a[s].minn[1]);a[k].sum+=a[s].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(mid<r) 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 opt=getdis(k,x,y,z);if(opt==1) return a[k].sum;if(opt==-1) return 0;ll ans=0;if(x*a[k].p[0]+y*a[k].p[1]<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;ll x,y,z;scanf("%d%d",&n,&m);for(int 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);for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&x,&y,&z),printf("%lld\n",query(root,x,y,z));return 0;
}

小结:这道题还挺裸的... ...

转载于:https://www.cnblogs.com/ShuraK/p/9393254.html

[bzoj2850]巧克力王国_KD-Tree相关推荐

  1. 【bzoj2850】巧克力王国 KD-tree

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

  2. 洛谷 P4475 巧克力王国 解题报告

    P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...

  3. 巧克力王国 BZOJ 2850

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

  4. 回溯法排序树怎么画_kd tree(k-dimensional树的简称)

    kd tree建立 计算各个维度方差最大的那一个.方差大说明沿该轴方向上的数据分散的越开.下图所示. 选择该特征的中位数作为分割点,小于该数的为左子树,大于的为右子树.这里用中位数是为了让左子树和右子 ...

  5. P4475 巧克力王国(KDTree)

    传送门 首先可以把约束条件看成一条直线,然后每个巧克力看成一个点,求给定区域内的点权和 用KDTree,每次判断一下当前矩形是否整个都在里面或都在外面,是的话直接返回,否则的话递归 注意,必须该矩形四 ...

  6. kd树 python实现_KD Tree的原理及Python实现

    提到KD-Tree相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),大名鼎鼎的KNN算法就用到了KD-Tree.本文就KD-Tree的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完 ...

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

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

  8. 省选+NOI 第五部分 高级数据结构

    左偏树 [AgOHの数据结构]左偏树 [AgOHの数据结构]左偏树_哔哩哔哩_bilibili CSU-ICPC集训课程 启发式合并和左偏树 CSU-ICPC集训课程 启发式合并和左偏树_哔哩哔哩_b ...

  9. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

最新文章

  1. 在ubuntu下安显卡驱动
  2. ActiveXObject函数详解
  3. linux系统下top命令的详细用法、参数详解、以及模式配置
  4. 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】
  5. 《C++标准程序库》学习笔记5 — 第七章
  6. python字符串find_Python字符串| 带示例的find()方法
  7. 强人工智能基本问题:神经网络分层还是不分层
  8. select模型使用例子
  9. 每日算法系列【LeetCode 121】买卖股票的最佳时机
  10. 【Flutter】Dart的工厂构造方法单例对象初始化列表
  11. Mnist数据集介绍
  12. linux配置c11,C11标准的泛型机制
  13. gif动图怎么制作?手把手教你视频转gif动图
  14. 计算机按键截图,截图按什么键,电脑按哪个键是截屏
  15. 70K的QQ——MiniQQ
  16. 【原创】赋值法写基础解系中解向量
  17. 5项基因改造让你拥抱大财富
  18. 中小学python编程教学-中小学青少年编程课程
  19. tf.round(): 四舍六入五取偶
  20. 这位“华为天才少年”,竟然要我用“充电宝”打《只狼》

热门文章

  1. wnoise matlab,MATLAB中用wnoise函数测试去噪算法
  2. 重读经典:完全解析特征学习大杀器 ResNet
  3. 基础知识(七)opencv、python、人脸框检测
  4. 水土保持功能评估中k值的计算公式
  5. win10隐藏linux,Win10如何隐藏Windows Defender任务栏图标
  6. Docker 修改容器名称
  7. SpringBoot2 Redis连接池
  8. H3C认证无线高级工程师
  9. 扫地机器人水箱背景_水箱尘盒组件及扫地机器人的制作方法
  10. 语言怎么解决扭魔方_吧台高度没留够,怎么坐都变扭,直接加玻璃框没想到也能解决难题...