[BZOJ2850]巧克力王国
[BZOJ2850]巧克力王国
试题描述
输入
输出
输出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]巧克力王国相关推荐
- [bzoj2850]巧克力王国_KD-Tree
巧克力王国 bzoj-2850 题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c.求所有ax+by<=c的巧克 ...
- 【bzoj2850】巧克力王国 KD-tree
题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于每个人对于甜的程 ...
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- 巧克力王国 BZOJ 2850
巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...
- P4475 巧克力王国(KDTree)
传送门 首先可以把约束条件看成一条直线,然后每个巧克力看成一个点,求给定区域内的点权和 用KDTree,每次判断一下当前矩形是否整个都在里面或都在外面,是的话直接返回,否则的话递归 注意,必须该矩形四 ...
- bzoj 2850 巧克力王国 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询: 要注意值有负,所以不是直 ...
- 省选+NOI 第五部分 高级数据结构
左偏树 [AgOHの数据结构]左偏树 [AgOHの数据结构]左偏树_哔哩哔哩_bilibili CSU-ICPC集训课程 启发式合并和左偏树 CSU-ICPC集训课程 启发式合并和左偏树_哔哩哔哩_b ...
- K-D Tree学习笔记
引入 K-D Tree 是一种处理高维空间的数据结构. 支持O(nk−1k)O(n^{\frac {k-1}k})O(nkk−1)查询给定超矩形内的点的信息, kkk 为维数. 可以用替罪羊树的思想 ...
- [学习笔记] 乱世之神杀疯了 —— K-D tree
文章目录 K-D tree 建树 合并 插入 删除 查询(估价函数) 旋转坐标系 题目练习 [SDOI2012]最近最远点对 [Violet]天使玩偶/SJY摆棋子 [CQOI2016]K远点对 [国 ...
- idea的英文是什么意思_德芙和多芬的英文都是Dove!“Dove”究竟是什么意思?
不知你有没有发现多芬和德芙的品牌都是"DOVE",那你知道为啥吗? 多芬:DOVE,就是指鸽子,是象征一种希望.快乐.和平以及所有积极事物的名字. 德芙:德芙巧克力包装上总是有&q ...
最新文章
- 使用傅里叶变换进行图像边缘检测
- OpenStack组件
- java弹框形式输入_java中点击一个按钮弹出两个输入文本框的源代码
- reducebykeyandwindow java_Spark Streaming笔记整理(三):DS的transformation与output操作
- 我的bolg,我的收获(MVC首次接触)
- 不借助任何变量进行变量交换
- linux cat时间段,linux – cat / dev / urandom的输出是多么临时
- java中Jackson_java 中的好东西 jackson
- .NET Compact Framework.代码展开ComboBox下拉选项
- microsoft edge怎么截长图_实用技能 | Fireshot 网页截长图工具
- LQR 控制学习-LQR控制 MATLAB官方教程-LQR 控制器_状态空间系统Matlab/Simulink建模分析
- 华为HG8245C光猫破解用户连接数限制
- 深入理解Java内存模型(五)——锁
- 解决layui form组件使用botton按钮提交页面自动刷新问题
- 多元函数的高阶微分公式 与 Taylor公式
- 【机器学习】基于mnist数据集的手写数字识别
- PHP打印对象 用[]可以 用.不可以 不知所以然
- 淘宝退货退款测试用例
- mysql建库建表全过程20201215
- HLS直播预取视频并更新m3u8
热门文章
- Java实现opendir的api_api代码生成
- java jpa自身关联_java-如何通过JPA / Hibernate加入获取两个关联
- hinernate中持久化对象的状态
- Python进阶(一)Python中的内置函数、内置方法、私有属性和方法详解
- [洛谷P3621] [APIO2007] 风铃
- 【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
- 【转】宝贝,我要出嫁了……
- [转]关于Win32 Console的计时器
- linux中,使用cat、head、tail命令显示文件指定行
- day41 - 异步IO、协程