bzoj 2850
比较基础的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的更多相关文章
- bzoj 2850 巧克力王国
bzoj 2850 巧克力王国 钱限题.题面可以看这里. 显然 \(x\) \(y\) 可以看成坐标平面上的两维,蛋糕可以在坐标平面上表示为 \((x,y)\) ,权值为 \(h\) .用 \(kd- ...
- bzoj 2850 巧克力王国——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 改一下估价即可.判断子树能否整个取或者是否整个不能取,时间好像就能行了? 因为有负数, ...
- bzoj 2850 巧克力王国 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询: 要注意值有负,所以不是直 ...
- bzoj 2850: 巧克力王国 K-D树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2850 题解 对于每个人,我们发现它能够接受的巧克力中 如果对参数分别讨论,那么一定是一个连 ...
- 【BZOJ 2850】巧克力王国
复习了下KDtree,贴一下新板子233. #include "bits/stdc++.h" using namespace std; inline int read(){ ,k= ...
- 巧克力王国 BZOJ 2850
巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...
- BZOJ 2850: 巧克力王国 KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...
- 【BZOJ】【2850】【Violet 0】巧克力王国
KD-Tree 问平面内在某条直线下方的点的权值和 我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$... 然而这并不对啊…… ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
随机推荐
- Spring4笔记1--Spring概述、IoC
Spring概述: Spring框架: Spring 由 20 多个模块组成,它们可以分为数据访问/集成(Data Access/Integration).Web.面向切面编程(AOP, Aspec ...
- mysql使用模板解决旧数据处理,默认初始化数据的通用方法!
一 业务介绍 先来看看我这得大致业务需求,这次业务比较简单: 即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干 ...
- Oracle Certified Java Programmer 经典题目分析(一)
Given: 1. public class returnIt { 2. returnType methodA(byte x, double y){ 3. return (short) x/y * 2 ...
- 串口流控制详解(CTS/RTS,DTR/DSR)
1 首先看下关于流控相关的几个端口的解释如下图 除了必要的地(GND)要连接外,其它连如下 步骤阅读 2 计算机和猫(MODEM)的连接 步骤阅读 步骤阅读 3 计算机和非猫的连接(null mod ...
- 10款常见MySQL高可用方案选型解读【转】
我们在考虑MySQL数据库的高可用架构时,主要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断. 用作备份. ...
- JS动态创建元素(两种方法)
前言 创建元素有两种方法 1)将需要创建的元素,以字符串的形式拼接:找到父级元素,直接对父级元素的innnerHTML进行赋值. 2)使用Document.Element对象自带的一些函数,来实现动态 ...
- matlab随笔(二)
circshift 两种形式 :第一种Y = circshift(A,K)就不用说了,将A中的元素向右移动K个位置. 需要注意的是第二种形式:Y = circshift(A,K,dim),这种形式不好 ...
- 在SQL2008和2012里面怎么让显示全部行和编辑 全部而不是200和1000
在sql server2008里面,可能微软考虑到数据量比较大,如果直接返回所有行,可能造成耗费时间过多.所有默认为"编辑前200行"和"返回前1000行".这 ...
- SQL中rownum和order by的执行顺序的问题
在一个SQL中,如果同时使用rownum和order by,会有一个先后顺序的问题. 比如select id1,id2 from t_tablename where rownum<3 order ...
- MySQL学习笔记:upper、lower、ucase、lacase——字符串函数
在MySQL中,通过利用upper.lower.ucase.lacase几个函数对字符串进行大小写转换. upper(str)——根据当前字符集映射返回字符串str,并将所有字符更改为大写.默认值是l ...