比较基础的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. VC++6.0中ClassView中类消失 解决方案[转自网络]

    有时候在VC++6.0中编程会出现这样一个问题,由于对C...View类的操作后,在窗口左边ClassView框中的C...View类会消失,这种操作通常是在C...View类中右击点“Add Win ...

  2. 聊天室(下篇)GatewayWorker 与 Laravel 的整合

    思路 上一篇大概梳理了一下 GatewayWorker 的基础知识.这篇就来准备整合 GatewayWorker 到 Laravel. GatewayWorker 是基于 Socket 监听的服务器框 ...

  3. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  4. 三、springboot热部署

    1.spring-boot-devtools 实现热部署 spring-boot-devtools 最重要的功能就是热部署.它会监听 classpath 下的文件变动,并且会立即重启应用. <d ...

  5. js中this揭秘

    前端面试题中经常会考this指向问题,初学者通常都会晕头转向,不知所以然.今天我就来讲讲js中this指向问题. this指向大概分为5种情况,记住这6个规律,基本上面试题都能解决. 通过圆括号直接调 ...

  6. 洛谷P3385负环

    传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  7. 洛谷P1411 砝码称重

    传送门啦 这个题总体思路就是先搜索在 $ dp $ void dfs(int keep,int now){ //使用 放弃 if(now > m) return; //已经放弃超过m个了,就退出 ...

  8. hdu 5943(素数间隔+二分图匹配)

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  9. dos批处理知识

    echo 命令 rem 命令 pause 命令 call 命令 start 命令 goto 命令 set 命令 编辑本段批处理符号简介 回显屏蔽 重定向1 与 重定向2 管道符号 转义符 逻辑命令符 ...

  10. JavaScript工程师都应懂的33个概念

    最近福利发的有点多啊,各种硬干货,小伙伴们是不是觉得很爽啊.Github真的蕴含着各种各样的宝藏,难怪各个大厂也都纷纷贡献自己的代码到Github上. 所以各种干货还是会源源不断的po给大家,觉得有帮 ...