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 ...
随机推荐
- Linux下如何在进程中获取虚拟地址对应的物理地址【转】
转自:http://blog.csdn.net/kongkongkkk/article/details/74366200 如果让你编写一个程序,来获取虚拟地址对应的物理地址..你会试着操作MMU吗.. ...
- 使用Netcat进行攻击
https://www.freebuf.com/column/135007.html 在网上找到了一个开启了ftp服务的服务: http://static.vhdong.com/Upload/Temp ...
- 【2017-10-1】雅礼集训day1
今天的题是ysy的,ysy好呆萌啊. A: 就是把一个点的两个坐标看成差分一样的东西,以此作为区间端点,然后如果点有边->区间没有交. B: cf原题啊.....均摊分析,简单的那种. 线段树随 ...
- Scrapy官网程序执行示例
Windows 10家庭中文版本,Python 3.6.4,Scrapy 1.5.0, Scrapy已经安装很久了,前面也看了不少Scrapy的资料,自己尝试使其抓取微博的数据时,居然连登录页面(首页 ...
- 洛谷P1177快速排序
传送门 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- POJ 2195 Going Home(KM算法模板)
题目链接:http://poj.org/problem?id=2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致. man每移动一格需花费$1 ...
- ROS + Caffe 机器人操作系统框架和深度学习框架笔记 (機器人控制與人工智能)
ROS + Caffe,这里以环境中物体识别为示例,机器人怎么知道环境里面有什么呢? [0.0567392 - n03376595 folding chair][0.0566773 - n040999 ...
- hdu 5112 (2014北京现场赛 A题)
给出某个时刻对应的速度 求出相邻时刻的平均速度 输出最大值 Sample Input23 // n2 2 //t v1 13 430 31 52 0 Sample OutputCase #1: 2.0 ...
- sdoi2014-向量集-线段树-二分斜率
注意到线段树一个节点只有满了才会被用到,那时再建ConvexHull就行了... #include <bits/stdc++.h> using namespace std; namespa ...
- Gitlab-system-hooks
当创建或者删除,用户或者项目时,可能想收到一个通知.Gitlab支持这种类型的system hooks. 下面事件可以触发一个system webhook调用. Project created Pro ...