[BZOJ2850]巧克力王国

试题描述

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

题解

题意就是统计一条给定直线下方或是上方的点权和。讨论一下 a 和 b 的正负性,然后判断一下一个矩形内是否可能有合法的点。

例如斜率为正的一条直线和一个矩形,要统计直线上方的点。若矩形左上角在直线上方则这个矩形可能有合法的点,若矩形右下角在直线上方则这个矩形内所有点都合法。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;
#define LL long longconst int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {if(Head == Tail) {int l = fread(buffer, 1, BufferSize, stdin);Tail = (Head = buffer) + l;}return *Head++;
}
LL read() {LL x = 0, f = 1; char c = Getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }return x * f;
}#define maxn 50010
#define oo 2147483647
int n, m, Cur, ToT, root, lc[maxn], rc[maxn];
struct Node {int x[2], mx[2], mn[2]; LL val, sum;bool operator < (const Node& t) const { return x[Cur] < t.x[Cur]; }
} nodes[maxn];void maintain(int o) {int l = lc[o], r = rc[o];for(int i = 0; i < 2; i++) {nodes[o].mx[i] = max(max(nodes[l].mx[i], nodes[r].mx[i]), nodes[o].x[i]);nodes[o].mn[i] = min(min(nodes[l].mn[i], nodes[r].mn[i]), nodes[o].x[i]);}nodes[o].sum = nodes[l].sum + nodes[r].sum + nodes[o].val;return ;
}
void build(int& o, int L, int R, int cur) {if(L > R){ o = 0; return ; }int M = L + R >> 1; o = M;Cur = cur; nth_element(nodes + L, nodes + M, nodes + R + 1);build(lc[o], L, M - 1, cur ^ 1); build(rc[o], M + 1, R, cur ^ 1);maintain(o);return ;
}bool tx, ty;
int a, b;
LL c;
bool all(int o) {tx ^= 1; ty ^= 1;int xx = tx ? nodes[o].mx[0] : nodes[o].mn[0], yy = ty ? nodes[o].mx[1] : nodes[o].mn[1];tx ^= 1; ty ^= 1;return ((LL)a * xx + (LL)b * yy < c);
}
bool has(int o) {int xx = tx ? nodes[o].mx[0] : nodes[o].mn[0], yy = ty ? nodes[o].mx[1] : nodes[o].mn[1];
//  printf("%d: %d %d %d %d\n", o, xx, yy, tx, ty);return ((LL)a * xx + (LL)b * yy < c);
}
LL query(int o) {if(!o) return 0;LL ans = 0;
//  printf("o: %d %d\n", o, root);if(all(lc[o])) ans += nodes[lc[o]].sum;else if(has(lc[o])) ans += query(lc[o]);if(all(rc[o])) ans += nodes[rc[o]].sum;else if(has(rc[o])) ans += query(rc[o]);int xx = nodes[o].x[0], yy = nodes[o].x[1];if((LL)a * xx + (LL)b * yy < c) ans += nodes[o].val;return ans;
}int main() {nodes[0].mx[0] = nodes[0].mx[1] = -oo;nodes[0].mn[0] = nodes[0].mn[1] = oo;nodes[0].sum = 0;n = read(); m = read(); LL sum = 0;for(int i = 1; i <= n; i++) {nodes[++ToT].x[0] = read(); nodes[ToT].x[1] = read(); nodes[ToT].val = read();sum += nodes[ToT].val;}build(root, 1, n, 0);while(m--) {a = read(); b = read(); c = read();if(a == 0 && b == 0) {if(c > 0) printf("%lld\n", sum); else puts("0");continue;}if(a == 0 && b > 0) tx = ty = 0;if(a == 0 && b < 0) tx = 0, ty = 1;if(a > 0 && b == 0) tx = ty = 0;if(a < 0 && b == 0) tx = ty = 1;if(a > 0 && b > 0) tx = ty = 0;if(a < 0 && b > 0) tx = 1, ty = 0;if(a > 0 && b < 0) tx = 0, ty = 1;if(a < 0 && b < 0) tx = ty = 1;printf("%lld\n", query(root));}return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5578194.html

[BZOJ2850]巧克力王国相关推荐

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

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

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

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

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

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

  4. 巧克力王国 BZOJ 2850

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

  5. P4475 巧克力王国(KDTree)

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

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

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

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

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

  8. K-D Tree学习笔记

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

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

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

  10. idea的英文是什么意思_德芙和多芬的英文都是Dove!“Dove”究竟是什么意思?

    不知你有没有发现多芬和德芙的品牌都是"DOVE",那你知道为啥吗? 多芬:DOVE,就是指鸽子,是象征一种希望.快乐.和平以及所有积极事物的名字. 德芙:德芙巧克力包装上总是有&q ...

最新文章

  1. 使用傅里叶变换进行图像边缘检测
  2. OpenStack组件
  3. java弹框形式输入_java中点击一个按钮弹出两个输入文本框的源代码
  4. reducebykeyandwindow java_Spark Streaming笔记整理(三):DS的transformation与output操作
  5. 我的bolg,我的收获(MVC首次接触)
  6. 不借助任何变量进行变量交换
  7. linux cat时间段,linux – cat / dev / urandom的输出是多么临时
  8. java中Jackson_java 中的好东西 jackson
  9. .NET Compact Framework.代码展开ComboBox下拉选项
  10. microsoft edge怎么截长图_实用技能 | Fireshot 网页截长图工具
  11. LQR 控制学习-LQR控制 MATLAB官方教程-LQR 控制器_状态空间系统Matlab/Simulink建模分析
  12. 华为HG8245C光猫破解用户连接数限制
  13. 深入理解Java内存模型(五)——锁
  14. 解决layui form组件使用botton按钮提交页面自动刷新问题
  15. 多元函数的高阶微分公式 与 Taylor公式
  16. 【机器学习】基于mnist数据集的手写数字识别
  17. PHP打印对象 用[]可以 用.不可以 不知所以然
  18. 淘宝退货退款测试用例
  19. mysql建库建表全过程20201215
  20. HLS直播预取视频并更新m3u8

热门文章

  1. Java实现opendir的api_api代码生成
  2. java jpa自身关联_java-如何通过JPA / Hibernate加入获取两个关联
  3. hinernate中持久化对象的状态
  4. Python进阶(一)Python中的内置函数、内置方法、私有属性和方法详解
  5. [洛谷P3621] [APIO2007] 风铃
  6. 【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
  7. 【转】宝贝,我要出嫁了……
  8. [转]关于Win32 Console的计时器
  9. linux中,使用cat、head、tail命令显示文件指定行
  10. day41 - 异步IO、协程