比较基础的KD树。每个节点维护一个BOX,包含包含当当前子树的点的最小矩形,以及点权和,然后用“整个矩形都在直线的一侧”和“整个矩形都不在直线的一侧”剪枝。

 /**************************************************************
Problem: 2850
User: idy002
Language: C++
Result: Accepted
Time:27240 ms
Memory:3740 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
#define N 50010
#define oo 1000000001
#define fprintf(...)
using namespace std; typedef long long dnt; struct Point {
int x, y, h;
void read() { scanf( "%d%d%d", &x, &y, &h ); }
Point(){}
Point( int x, int y, int h ):x(x),y(y),h(h){}
bool in( dnt a, dnt b, int c ) {
return a*x+b*y<c;
}
};
typedef bool (*Cmp)( const Point &a, const Point &b );
struct Box {
int xmin, xmax;
int ymin, ymax;
dnt sum;
Box():xmin(oo),xmax(-oo),ymin(oo),ymax(-oo){}
void add( Point &p ) {
xmin = min( xmin, p.x );
xmax = max( xmax, p.x );
ymin = min( ymin, p.y );
ymax = max( ymax, p.y );
sum += p.h;
}
void add( Box &b ) {
xmin = min( xmin, b.xmin );
xmax = max( xmax, b.xmax );
ymin = min( ymin, b.ymin );
ymax = max( ymax, b.ymax );
sum += b.sum;
}
bool in( dnt a, dnt b, int c ) {
return (a*xmin+b*ymin<c)
&& (a*xmax+b*ymin<c)
&& (a*xmin+b*ymax<c)
&& (a*xmax+b*ymax<c);
}
bool out( dnt a, dnt b, int c ) {
return (a*xmin+b*ymin>=c)
&& (a*xmax+b*ymin>=c)
&& (a*xmin+b*ymax>=c)
&& (a*xmax+b*ymax>=c);
}
};
struct Node {
Point p;
Box box;
Cmp cmp;
Node *ls, *rs;
}pool[N], *tail=pool, *root; int n, m;
Point pts[N];
Cmp cmp[]; bool cmpx( const Point &a, const Point &b ) {
return a.x<b.x;
}
bool cmpy( const Point &a, const Point &b ) {
return a.y<b.y;
}
Node *build( int lf, int rg, int c ) {
if( lf>rg ) return ;
Node *nd = ++tail;
int mid=(lf+rg)>>;
nth_element( pts+lf, pts+mid, pts+rg+, cmp[c] );
nd->cmp = cmp[c];
nd->p = pts[mid];
nd->ls = build( lf, mid-, !c );
nd->rs = build( mid+, rg, !c );
if( nd->ls ) nd->box.add( nd->ls->box );
if( nd->rs ) nd->box.add( nd->rs->box );
nd->box.add( pts[mid] );
fprintf( stderr, "(%d,%d,%d) ", pts[mid].x, pts[mid].y, pts[mid].h );
return nd;
}
dnt query( Node *nd, int a, int b, int c ) {
if( nd->box.in(a,b,c) ) return nd->box.sum;
if( nd->box.out(a,b,c) ) return ;
dnt rt = ;
if( nd->ls ) rt += query( nd->ls, a, b, c );
if( nd->rs ) rt += query( nd->rs, a, b, c );
if( nd->p.in(a,b,c) ) rt += nd->p.h;
return rt;
}
int main() {
scanf( "%d%d", &n, &m );
for( int i=; i<=n; i++ )
pts[i].read();
cmp[] = cmpx;
cmp[] = cmpy;
root = build( , n, );
fprintf( stderr, "\n" );
for( int i=,a,b,c; i<=m; i++ ) {
scanf( "%d%d%d", &a, &b, &c );
printf( "%lld\n", query(root,a,b,c) );
}
}

bzoj 2850的更多相关文章

  1. bzoj 2850 巧克力王国

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

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

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

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

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

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

    题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2850 题解 对于每个人,我们发现它能够接受的巧克力中 如果对参数分别讨论,那么一定是一个连 ...

  5. 【BZOJ 2850】巧克力王国

    复习了下KDtree,贴一下新板子233. #include "bits/stdc++.h" using namespace std; inline int read(){ ,k= ...

  6. 巧克力王国 BZOJ 2850

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

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

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

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

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

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. excel导入时候日期格式转成date

    最近在做导入的时候发现,excel中设置数值格式是不能有日期的那些符号出现的,/ - : 之类的,否则就会变成数字到了java后台,设置成日期,比如 yyyy-mm-dd 到了后台也是数字,即距离19 ...

  2. PE结构详解

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”.为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支.避开错误的内存位置等 ...

  3. 事件,使用.net自带委托EventHandler

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. ASP防XSS代码

    原作是在GitHub上,基于Node.js所写.但是..ASP的JS引擎跟V8又有些不同..于是,嗯.. <% Function AntiXSS_VbsTrim(s) AntiXSS_VbsTr ...

  5. [HBase] 服务端RPC机制及代码梳理

    基于版本:CDH5.4.2 上述版本较老,但是目前生产上是使用这个版本,所以以此为例. 1. 概要 说明: 客户端API发送的请求将会被RPCServer的Listener线程监听到. Listene ...

  6. 数据库--mysql介绍

    一:什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件 ...

  7. SHELL 中的变量

    变量的分类 系统环境变量 系统本身所有,通常为大写字母 系统变量通过 set 或 declare 指令进行查看 UDV 变量(user defined variable ) 用户创建和维护,建议大写 ...

  8. Linux入门(二)Shell基本命令

    上一篇讲了普通用户切换到root用户,今天补充一点,对于Debian和Ubuntu用户,安装时候只有一个普通用户注册,在需要root权限时,我们可以在普通用户模式下输入sudo这个命令运行某些相关特权 ...

  9. linux 安装 Elasticsearch6.4.0详细步骤以及问题解决方案

    1.jdk 安装 参考资料:https://www.cnblogs.com/shihaiming/p/5809553.html 2.elasticsearch 安装 下载:https://artifa ...

  10. hibernate cascade

    默认:none Cascade 属性值: none:在保存.删除修改对象的时候,不考虑其附属物的操作 save-update:在保存.更新当前对象时,级联保存.更新附属物. delete:在删除当前对 ...