巧克力王国

【问题描述】

巧克力王国里的巧克力都是由牛奶和可可做成的。但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力。对于每一块巧克力,我们设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

【数据范围】

1 <= n, m <= 50000,-10^9 <= a, b, x, y <= 10^9。


题解:

考虑 ax + by - c 其实是平面上的一条直线,x、y就是点的横坐标和纵坐标

要求 ax + by < c ,就是要求点在 ax + by - c 的下方

那么就用KD树就好了

程序中用了一个 nth_element(a + l, a + m, a + r + 1, cmp) 函数

就是按cmp定义的大小规则,将a数组中l到r中第m大的数放在第m位,比这个数小的数在第m位前,其他在第m位后(乱序)

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cstdio>
  6 #include<cmath>
  7 #define lc(i) tr[i].l
  8 #define rc(i) tr[i].r
  9 #define mi_x(i) tr[i].mi_x
 10 #define ma_x(i) tr[i].ma_x
 11 #define mi_y(i) tr[i].mi_y
 12 #define ma_y(i) tr[i].ma_y
 13 #define sum(i) tr[i].sum
 14 typedef long long lol;
 15 using namespace std;
 16 inline lol Get()
 17 {
 18     lol x;
 19     lol o = 1;
 20     char c;
 21     while((c = getchar()) < '0' || c > '9')
 22         if(c == '-')
 23             o = -1;
 24     x = c - '0';
 25     while((c = getchar()) >= '0' && c <= '9') x = x * 10 + c - '0';
 26     return x * o;
 27 }
 28 const int me = 1000233;
 29 const lol inf = 214748364721474836;
 30 struct dot
 31 {
 32     int l, r;
 33     lol x, y, z, sum, mi_x, mi_y, ma_x, ma_y;
 34     dot()
 35     {
 36         mi_x = mi_y = inf;
 37         ma_x = ma_y = -inf;
 38     }
 39 };
 40 dot a[me], tr[me];
 41 lol x, y, z;
 42 int n, m;
 43 int flag;
 44 lol ans;
 45 inline bool operator < (const dot &a, const dot &b)
 46 {
 47     if(!flag) return a.x < b.x;
 48     return a.y < b.y;
 49 }
 50 inline void Update(const int &x)
 51 {
 52     int l = lc(x), r = rc(x);
 53     mi_x(x) = min(tr[x].x, min(mi_x(l), mi_x(r)));
 54     ma_x(x) = max(tr[x].x, max(ma_x(l), ma_x(r)));
 55     mi_y(x) = min(tr[x].y, min(mi_y(l), mi_y(r)));
 56     ma_y(x) = max(tr[x].y, max(ma_y(l), ma_y(r)));
 57     sum(x) = sum(l) + sum(r) + tr[x].z;
 58 }
 59 int Build(const int &l, const int &r, const int &e)
 60 {
 61     int mi = l + r >> 1;
 62     flag = e;
 63     nth_element(a + l, a + mi, a + r + 1);
 64     tr[mi] = a[mi];
 65     if(l < mi) lc(mi) = Build(l, mi - 1, e ^ 1);
 66     if(r > mi) rc(mi) = Build(mi + 1, r, e ^ 1);
 67     Update(mi);
 68     return mi;
 69 }
 70 inline int Check(const int &wx, const int &wy)
 71 {
 72     return (lol) wx * x + wy * y < z;
 73 }
 74 inline int Pos(const int &w)
 75 {
 76     if(!w) return 0;
 77     return Check(mi_x(w), mi_y(w)) + Check(mi_x(w), ma_y(w)) + Check(ma_x(w), mi_y(w)) + Check(ma_x(w), ma_y(w));
 78 }
 79 void Ask(const int &w)
 80 {
 81     int l = lc(w), r = rc(w);
 82     if(Check(tr[w].x, tr[w].y)) ans += tr[w].z;
 83     int le = Pos(l);
 84     if(le)
 85         if(le == 4) ans += sum(l);
 86         else Ask(l);
 87     int ri = Pos(rc(w));
 88     if(ri)
 89         if(ri == 4) ans += sum(r);
 90         else Ask(r);
 91 }
 92 int main()
 93 {
 94     n = Get(), m = Get();
 95     for(int i = 1; i <= n; ++i)
 96         a[i].x = Get(), a[i].y = Get(), a[i].z = Get();
 97     Build(1, n, 0);
 98     for(int i = 1; i <= m; ++i)
 99     {
100         x = Get(), y = Get(), z = Get();
101         ans = 0;
102         Ask(1 + n >> 1);
103         printf("%lld\n", ans);
104     }
105 }

转载于:https://www.cnblogs.com/lytccc/p/6429665.html

巧克力王国 BZOJ 2850相关推荐

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

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

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

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

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

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

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

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

  5. P4475 巧克力王国(KDTree)

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

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

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

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

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

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

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

  9. K-D Tree学习笔记

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

最新文章

  1. Java RandomAccessFile的使用
  2. 基于大规模结构化病例数据的新型冠状病毒传播特征和感染人群分析
  3. 异或方式找到一组数组中不重复的两个数(同班同学方法)
  4. cnpm在ubuntu19.10下面的安装以及vue.js中el的意思
  5. Atom飞行手册翻译: 2.1 Atom中的包
  6. 史上最大内存!曝iPhone 14 Pro系列运行内存将增至8GB
  7. java native 开发环境搭建_Java3D 集成开发环境部署与配置(含实例)
  8. Android 四大组件 之 活动(Activity)
  9. 京东API接口:item_search - 按关键字搜索商品
  10. win10升级补丁_干掉烦人的win10升级助手gwx
  11. Offset commit failed with a retriable exception. You should retry committing the latest consumed off
  12. 知识产权保护的内容有哪些?
  13. 突破与升维,技术赋能下的新时代企业营销攻略(附报告下载)
  14. 解决APP抓包问题【网络安全】
  15. Frontiers | 北林邬荣领/何晓青-网络作图揭示拟南芥与叶际微生物组互作机制
  16. Unity3D游戏开发之在uGUI中使用不规则精灵制作按钮
  17. SELECT高级查询——连接查询、子查询(多表数据查询)
  18. pyqt创建窗口没有句柄_史上最强之《Pyqt》写游戏
  19. 从异构软件开发者的角度看异构计算
  20. 刨根问底Objective-C Runtime(1)- Self Super

热门文章

  1. php取结果集,php获取数据库结果集方法(推荐)
  2. Spring Boot笔记-@ComponentScan初步解析
  3. Java笔记-使用CXF开发WebService服务器
  4. C++|Java工作笔记-google protobuf基本使用
  5. OpenCV如何修改Mat中某像素(某通道的数值)
  6. Qt工作笔记-自定义开关控件
  7. Java题-直接赋值与重新创建内存
  8. 图片模糊化处理_10个JavaScript图像处理库,收藏好留备用
  9. python字符串的方法和列表的方法_Python 中列表和字符串的方法总结
  10. java 点对点_[java] java消息服务 (二) 点对点模型P2P