题目大意

http://www.lydsy.com/JudgeOnline/problem.php?id=2850

题解

对于每个人,我们发现它能够接受的巧克力中

如果对参数分别讨论,那么一定是一个连续的区间

所以我们利用K-D划分维度,然后直接搜就好了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline ll min(ll a,ll b,ll c){return min(a,min(b,c));}
inline ll max(ll a,ll b,ll c){return max(a,max(b,c));}
const int maxn = 50010;
const int dem = 2;
struct Node{
ll pos[2],sum,val;
ll minn[2],maxx[2];
Node *ch[2];
void update(){
minn[0] = min(pos[0],ch[0]->minn[0],ch[1]->minn[0]);
maxx[0] = max(pos[0],ch[0]->maxx[0],ch[1]->maxx[0]);
minn[1] = min(pos[1],ch[0]->minn[1],ch[1]->minn[1]);
maxx[1] = max(pos[1],ch[0]->maxx[1],ch[1]->maxx[1]);
sum = val + ch[0]->sum + ch[1]->sum;
}
}*null,*root;
Node T[maxn],aNoUseNode;
inline void init(){
null = &aNoUseNode;null->ch[0] = null->ch[1] = null;
null->sum = null->val = 0;
null->minn[0] = 1LL<<60;null->maxx[0] = -(1LL<<60);
null->minn[1] = 1LL<<60;null->maxx[1] = -(1LL<<60);
}
int split[maxn],now;
inline bool cmp(const Node &a,const Node &b){
return a.pos[split[now]] < b.pos[split[now]];
}
Node *build(int l,int r,int s){
if(l > r) return null;
int mid = (l+r) >> 1;
split[now = mid] = s % dem;
nth_element(T+l,T+mid,T+r+1,cmp);
Node *p = &T[mid];
p->ch[0] = build(l,mid-1,s+1);
p->ch[1] = build(mid+1,r,s+1);
p->update();return p;
}
ll a,b,c;
inline bool judge1(Node *p){
return (a*p->minn[0] + b*p->minn[1] < c)
&& (a*p->minn[0] + b*p->maxx[1] < c)
&& (a*p->maxx[0] + b*p->minn[1] < c)
&& (a*p->maxx[0] + b*p->maxx[1] < c);
}
inline bool judge2(Node *p){
return (a*p->minn[0] + b*p->minn[1] >= c)
&& (a*p->minn[0] + b*p->maxx[1] >= c)
&& (a*p->maxx[0] + b*p->minn[1] >= c)
&& (a*p->maxx[0] + b*p->maxx[1] >= c);
}
ll query(Node *p){
if(p == null) return 0;
ll ret = 0;
if(a*p->pos[0] + b*p->pos[1] < c) ret += p->val;
if(judge1(p->ch[0])) ret += p->ch[0]->sum;
else if(!judge2(p->ch[0])) ret += query(p->ch[0]);
if(judge1(p->ch[1])) ret += p->ch[1]->sum;
else if(!judge2(p->ch[1])) ret += query(p->ch[1]);
return ret;
}
int main(){
init();
ll n,m;read(n);read(m);
for(int i=1;i<=n;++i){
read(T[i].pos[0]);read(T[i].pos[1]);
read(T[i].val);T[i].ch[0] = T[i].ch[1] = null;
T[i].update();
}
root = build(1,n,1);
while(m--){
read(a);read(b);read(c);
printf("%lld\n",query(root));
}
getchar();getchar();
return 0;
}

bzoj 2850: 巧克力王国 K-D树的更多相关文章

  1. bzoj 2850 巧克力王国

    bzoj 2850 巧克力王国 钱限题.题面可以看这里. 显然 \(x\) \(y\) 可以看成坐标平面上的两维,蛋糕可以在坐标平面上表示为 \((x,y)\) ,权值为 \(h\) .用 \(kd- ...

  2. BZOJ 2850: 巧克力王国 KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...

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

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

  4. bzoj 2850 巧克力王国——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 改一下估价即可.判断子树能否整个取或者是否整个不能取,时间好像就能行了? 因为有负数, ...

  5. 【BZOJ】【2850】【Violet 0】巧克力王国

    KD-Tree 问平面内在某条直线下方的点的权值和 我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$... 然而这并不对啊…… ...

  6. 巧克力王国 BZOJ 2850

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

  7. BZOJ2820 - 巧克力王国

    原题链接 Description 给出个二维平面上的点,第个点为,权值为.接下来次询问,给出,求所有满足的点的权值和. Solution 对于这个点建一棵k-d树,子树维护一个子树和. 如果子树所代表 ...

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

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

  9. bzoj2850巧克力王国

    巧克力王国 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 861  Solved: 325[Submit][Status][Discuss] Desc ...

随机推荐

  1. Linux系统下授权MySQL账户访问指定数据库和数据库操作

    Linux系统下授权MySQL账户访问指定数据库 需求: 1.在MySQL中创建数据库mydata 2.新建MySQL账户admin密码123456 3.赋予账户admin对数据库mydata具有完全 ...

  2. Android 逐帧动画( Drawable 动画),这一篇就够了

    前言 作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像 ...

  3. 查看并修改Linux主机名命令hostname

    查看主机名 hostname可以查看主机名 export也可以查看 修改主机名 echo new-hostname > /proc/sys/kernel/hostname (系统启动时,从此文件 ...

  4. HDOJ 题目3564 Another LIS(线段树单点更新,LIS)

    Another LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. eclipse转到IntelliJ IDEA 2017.1入坑指南

    最近准备从eclipse转到IDE上去,由于eclipse占用的内存太大,而且IDE看着逼格还是比较大的,在转移项目的时候遇到好多的坑呀!在这里记录一下 关于:2017.1版本 之前装的是2016的版 ...

  6. Java 并发随身记(一)之 Unsafe类

    最近在看Java并发相关的内容,需要自己整理整理,不然就生疏了.工作2年多,工作时一般注都是框架.消息这些内容,对基础内容比较忽视.闲话不说,既然是并发内容,首先先复习一下Unsafe的内容吧. Un ...

  7. 【BZOJ4861】[Beijing2017]魔法咒语 矩阵乘法+AC自动机+DP

    [BZOJ4861][Beijing2017]魔法咒语 题意:别看BZ的题面了,去看LOJ的题面吧~ 题解:显然,数据范围明显的分成了两部分:一个是L很小,每个基本词汇长度未知:一个是L很大,每个基本 ...

  8. SQL中的四种连接方式

    转自:http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指 ...

  9. sql server charindex函数和patindex函数详解(转)

    charindex和patindex函数常常用来在一段字符中搜索字符或字符串.假如被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数. ...

  10. 【题解】CJOI2019 登峰造鸡境 (Prufer序列+斯特林数)

    [题解]CJOI2019 登峰造鸡境 (Prufer序列+斯特林数) 题目背景 舒服了. 题目描述 你有一颗n个点的无根树,每个点有有一个标号(1~n). 现在你知道,总共有m个叶子节点,求不同的树的 ...