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 ...
随机推荐
- 【FCS NOI2018】福建省冬摸鱼笔记 day1
省冬的第一天. 带了本子,笔,一本<算法导论>就去了.惊讶于为什么同学不带本子记笔记. 他们说:“都学过了.”,果然这才是巨神吧. 第一天:数论,讲师:zzx 前几页的课件挺水,瞎记了点笔 ...
- Task多线程进行多进程
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...
- Oracle11g用户、权限、角色、概要文件管理及审计
第10章 安全管理 1 用户管理 2 权限管理 3 角色管理 : 4 概要文件管理 5 审计 操作系统:win7 Oracle安装目录:E盘 数据库名字:orcl 密码:123456 先 ...
- 11 The Go Memory Model go语言内置模型
The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...
- js点击页面其他地方如何隐藏div元素菜单
web页面常用的一个需求,写下拉菜单是我们往往不是用select_option,而是自定义一个元素列出选项来满足需求,当我们点击按钮出现菜单, 点击按钮或菜单以外页面空白地方隐藏该菜单,这里提供一种简 ...
- 关于 JVM 内存的 N 个问题(转)
JVM的内存区域是怎么划分的? JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程:有些区域会抛出OOM异常,有些则不会,了解JVM的内存区域划分以及特征,是定位线上内存问题的基础 ...
- java 判断字符串是否相等
判断字符串相等我们经常习惯性的写上if(str1==str2),这种写法在Java中可能会带来问题. java中判断字符串是否相等有两种方法: 1.用“==”运算符,该运算符表示指向字符串的引用是否相 ...
- HDU 3613 Best Reward(扩展KMP求前后缀回文串)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...
- Jenkins 集成 Sonar
Jenkins 与 Sonar 集成:Sonar 是 Jenkins 之外独立运行的一个服务.Jenkins 中安装插件 SonarQube(并配置其 Sonar Server 的 URL / Acc ...
- 20165333实验三 敏捷开发与XP实践
实验内容 一.参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题. 在IDE ...