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 ...
随机推荐
- 【技巧总结】Penetration Test Engineer[2]-Information gathering
2.信息收集 信息收集是属于前期交互阶段所需要了解的问题. 2.1.前期交互内容 签署授权文件:首要要和受测试方签订授权协议. 划定范围:指定了一个二级域名作为测试目标,那么其他二级域名在测试范围内. ...
- CentOS6.6中安装telnet
一.查看本机是否安装telnet rpm -qa | grep telnet 如果什么都不显示.说明你没有安装telnet 二.开始安装 yum install xinetd yum install ...
- iframe 同域下父子页面的通信
//共同引用的JS文件 common.js ; (function (window, $) { $(function ($) { window.trip = window.trip || {}; wi ...
- c++ 类的构造顺序
在单继承的情况下,父类构造先于子类,子类析构先于父类,例: class A { public: A() { cout << "A" << endl; } ~ ...
- js实现ctrl+v粘贴图片或是截图
浏览器环境:谷歌浏览器 1.ctrl+v粘贴图片都是监听paste时间实现的,复制的数据都存在clipboardData下面,虽然打印显示数据长度为0,但是还是可以获取数据的 2.打印clipboar ...
- 日期时间设置 "2018-05-04T16:36:23.6341371+08:00" 格式
using System;using System.Collections.Generic;using System.Globalization;using System.Text; namespac ...
- Java HashCode详解
一.为什么要有Hash算法 Java中的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素是否重复应该依据什 ...
- 编写组件TComponent published $M+ 问题
报错如下: PUBLISHED caused RTTI ($M+) to be added to type 修改成下面这样之后: 解决问题 方法: 来自:http://www.cnblogs.com/ ...
- C++有super关键字么?
很多人在学习Java之后,看到Java里面有super关键字,用来表示父类,那么C++里面有super关键字么? 答案是否定的.这也很容易理解,C++由于支持多继承,所以假设存在super关键字,那么 ...
- 更改MyEclipse中的src目录的浏览方式
看到这个标题,有人可能不会明白,这里先看张图: 右边的图就是我们要更改的样子,有的时候我们做项目需要看下目录的层次,于是使用了Navigator的那个视图,其实常用的这种包视图也可以变成那种样式. 这 ...