KD-Tree


  问平面内在某条直线下方的点的权值和

  我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$...

  然而这并不对啊……因为你得分类讨论啊……不能直接判那个式子的啊……

  膜拜了hzwer的姿势:四个角都判,那么这样就避免了分类讨论……轻松+愉快

今天突然发现:KD-Tree是会Push_up叶子节点的,这点跟线段树不一样……QAQ怪不得以前模板那样写是错的……

另外,鉴于上一题出了个讨厌的bug,我换了种姿势来push_up……味道好极了!

 /**************************************************************
Problem: 2850
User: Tunix
Language: C++
Result: Accepted
Time:35044 ms
Memory:3636 kb
****************************************************************/ //BZOJ 2850
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,INF=1e9;
/*******************template********************/
struct node{
int d[],mn[],mx[],l,r;
LL sum,v;
int& operator [] (int x){return d[x];}
void read(){d[]=getint();d[]=getint();sum=v=getint();}
}t[N];
int n,m,D,root;
bool operator < (node a,node b){return a[D]<b[D];} #define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
void Push_up(int o){
F(i,,){
t[o].mn[i]=min(t[o][i],min(t[L].mn[i],t[R].mn[i]));
t[o].mx[i]=max(t[o][i],max(t[L].mx[i],t[R].mx[i]));
}
t[o].sum=t[L].sum+t[R].sum+t[o].v;
} inline int build(int l,int r,int dir){
D=dir;
nth_element(t+l,t+mid,t+r+);
int o=mid;
L=l<mid ? build(l,mid-,dir^) : ;
R=mid<r ? build(mid+,r,dir^) : ;
Push_up(o);
return o;
}
int a,b,c;
inline bool check(int x,int y){return (LL)a*x+(LL)b*y<(LL)c;}
inline int calc(node o){
int ans=;
ans+=check(o.mn[],o.mn[]);
ans+=check(o.mx[],o.mn[]);
ans+=check(o.mn[],o.mx[]);
ans+=check(o.mx[],o.mx[]);
return ans;
}
inline LL query(int o){
if (!o) return ;
LL ans=;
if (check(t[o][],t[o][])) ans+=t[o].v;
int tl=L ? calc(t[L]) : ,tr=R ? calc(t[R]) : ;
if (tl==) ans+=t[L].sum;
else if (tl) ans+=query(L);
if (tr==) ans+=t[R].sum;
else if (tr) ans+=query(R);
return ans;
} int main(){
#ifndef ONLINE_JUDGE
freopen("2850.in","r",stdin);
freopen("2850.out","w",stdout);
#endif
F(i,,) t[].mn[i]=INF,t[].mx[i]=-INF;
t[].sum=t[].v=; n=getint(); m=getint();
F(i,,n) t[i].read();
root=build(,n,);
F(i,,m){
a=getint(); b=getint(); c=getint();
printf("%lld\n",query(root));
}
return ;
}

2850: 巧克力王国

Time Limit: 60 Sec  Memory Limit: 512 MB
Submit: 131  Solved: 54
[Submit][Status][Discuss]

Description

巧克力王国里的巧克力都是由牛奶和可可做成的。但是并不是每一块巧克力

都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力。

对于每一块巧克力,我们设x和y为其牛奶和可可的含量。

由于每个人对于甜的程度都有自己的评判标准,所以每个人都有两个参数a和

b,分别为他自己为牛奶和可可定义的权重,因此牛奶和可可含量分别为x和y

的巧克力对于他的甜味程度即为ax + by。而每个人又有一个甜味限度c,所有

甜味程度大于等于c的巧克力他都无法接受。

每块巧克力都有一个美味值h。

现在我们想知道对于每个人,他所能接受的巧克力的美味值之和为多少。

Input

第一行两个正整数n和m,分别表示巧克力个数和询问个数。

接下来n行,每行三个整数x,y,h,含义如题目所示。

再接下来m行,每行三个整数a,b,c,含义如题目所示。

Output

输出m行,其中第i行表示第i个人所能接受的巧克力的美味值之和。

Sample Input

3 3

1 2 5

3 1 4

2 2 1

2 1 6

1 3 5

1 3 7

Sample Output

5

0

4

HINT

对于100% 的数据,1 <= n, m <= 50000,1 <= 10^9,-10^9 <= a, b, x, y <= 10^9。

Source

[Submit][Status][Discuss]

【BZOJ】【2850】【Violet 0】巧克力王国的更多相关文章

  1. bzoj 2850 巧克力王国

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

  2. 巧克力王国 BZOJ 2850

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

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

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

  4. Bzoj2850 巧克力王国

    Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 505  Solved: 204 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但 ...

  5. 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

    BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...

  6. BZOJ2820 - 巧克力王国

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

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

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

  8. LG4475 巧克力王国

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

  9. 【BZOJ2850】巧克力王国 [KD-tree]

    巧克力王国 Time Limit: 60 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 巧克力王国里的巧克力都是由牛奶和 ...

随机推荐

  1. LoadRunner参数化时的中文乱码问题

    http://blog.sina.com.cn/s/blog_6cf205160100mdxi.html

  2. 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) B - Enlarging Enthusiasm dp好题

    B - Enlarging Enthusiasm 感觉做到过好多的dp题都会和单调性结合在一起. 思路:dp[ s ][ pre ][ res ] 表示的是已选择了s,上一个是pre, 还有res 的 ...

  3. 13:在O(1)时间内删除单向链表中的一个节点

    思路:如果从首部开始依次查找,那么时间是O(n). 既然我们知道要删除的结点i,那么我们就知道它指向的下一个结点j,那么我们可以将j的内容复制到i,然后将i的指针指向j的下一个结点,这样虽然看起来我们 ...

  4. ubuntu 14.04 Bob 安装

    1. 附件依赖项安装$ sudo add-apt-repository ppa:biometrics/bob $ sudo apt-get update $ sudo apt-get install ...

  5. [CodeForces]CodeForces 13D 几何 思维

    大致题意: 给出N个红点和M个蓝点,问可以有多少个红点构成的三角形,其内部不含有蓝点 假设我们现在枚举了一条线段(p[i],p[j]),我们可以记录线段下方满足(min(p[i].x,p[j].x)& ...

  6. Python网络编程之socket应用

    1 引言 本篇主要对Python下网络编程中用到的socket模块进行初步总结.首先从网络基础理论出发,介绍了TCP协议和UDP协议:然后总结了socket中的常用函数:最后通过实际代码展示基本函数的 ...

  7. 第1天:Django框架简介与工程创建

    Django简介 Django特点 环境搭建 创建工程 启动服务 使用pycharm打开工程 创建子应用 Django简介 Django,是用Python语言写的开源web开发框架,并遵循MVC设计. ...

  8. poj2676(数独)

    也是一个简单剪枝的dfs.记录所有为0的位置,依次填写,当发现某个空格可选的填写数字已经没有时,说明该支路无效,剪掉. 不算是一个难题吧,但是还是花了不少时间,问题主要出在细节上,行列坐标反了.3乘3 ...

  9. C# CuttingEdge.Conditions 验证帮助类库 文档翻译

    项目主页: https://archive.codeplex.com/?p=conditions 作者博客关于项目的文档(翻译原文): https://www.cuttingedge.it/blogs ...

  10. DataGridView、List<T>相关操作

    一.DataGridView数据转成DataTable 1.已绑定过数据源:DataTable dt = (dataGridView1.DataSource as DataTable) 2.未绑定过数 ...