比较基础的KD树。每个节点维护一个BOX,包含包含当当前子树的点的最小矩形,以及点权和,然后用“整个矩形都在直线的一侧”和“整个矩形都不在直线的一侧”剪枝。

  1. /**************************************************************
  2. Problem: 2850
  3. User: idy002
  4. Language: C++
  5. Result: Accepted
  6. Time:27240 ms
  7. Memory:3740 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <algorithm>
  12. #define N 50010
  13. #define oo 1000000001
  14. #define fprintf(...)
  15. using namespace std;
  16.  
  17. typedef long long dnt;
  18.  
  19. struct Point {
  20. int x, y, h;
  21. void read() { scanf( "%d%d%d", &x, &y, &h ); }
  22. Point(){}
  23. Point( int x, int y, int h ):x(x),y(y),h(h){}
  24. bool in( dnt a, dnt b, int c ) {
  25. return a*x+b*y<c;
  26. }
  27. };
  28. typedef bool (*Cmp)( const Point &a, const Point &b );
  29. struct Box {
  30. int xmin, xmax;
  31. int ymin, ymax;
  32. dnt sum;
  33. Box():xmin(oo),xmax(-oo),ymin(oo),ymax(-oo){}
  34. void add( Point &p ) {
  35. xmin = min( xmin, p.x );
  36. xmax = max( xmax, p.x );
  37. ymin = min( ymin, p.y );
  38. ymax = max( ymax, p.y );
  39. sum += p.h;
  40. }
  41. void add( Box &b ) {
  42. xmin = min( xmin, b.xmin );
  43. xmax = max( xmax, b.xmax );
  44. ymin = min( ymin, b.ymin );
  45. ymax = max( ymax, b.ymax );
  46. sum += b.sum;
  47. }
  48. bool in( dnt a, dnt b, int c ) {
  49. return (a*xmin+b*ymin<c)
  50. && (a*xmax+b*ymin<c)
  51. && (a*xmin+b*ymax<c)
  52. && (a*xmax+b*ymax<c);
  53. }
  54. bool out( dnt a, dnt b, int c ) {
  55. return (a*xmin+b*ymin>=c)
  56. && (a*xmax+b*ymin>=c)
  57. && (a*xmin+b*ymax>=c)
  58. && (a*xmax+b*ymax>=c);
  59. }
  60. };
  61. struct Node {
  62. Point p;
  63. Box box;
  64. Cmp cmp;
  65. Node *ls, *rs;
  66. }pool[N], *tail=pool, *root;
  67.  
  68. int n, m;
  69. Point pts[N];
  70. Cmp cmp[];
  71.  
  72. bool cmpx( const Point &a, const Point &b ) {
  73. return a.x<b.x;
  74. }
  75. bool cmpy( const Point &a, const Point &b ) {
  76. return a.y<b.y;
  77. }
  78. Node *build( int lf, int rg, int c ) {
  79. if( lf>rg ) return ;
  80. Node *nd = ++tail;
  81. int mid=(lf+rg)>>;
  82. nth_element( pts+lf, pts+mid, pts+rg+, cmp[c] );
  83. nd->cmp = cmp[c];
  84. nd->p = pts[mid];
  85. nd->ls = build( lf, mid-, !c );
  86. nd->rs = build( mid+, rg, !c );
  87. if( nd->ls ) nd->box.add( nd->ls->box );
  88. if( nd->rs ) nd->box.add( nd->rs->box );
  89. nd->box.add( pts[mid] );
  90. fprintf( stderr, "(%d,%d,%d) ", pts[mid].x, pts[mid].y, pts[mid].h );
  91. return nd;
  92. }
  93. dnt query( Node *nd, int a, int b, int c ) {
  94. if( nd->box.in(a,b,c) ) return nd->box.sum;
  95. if( nd->box.out(a,b,c) ) return ;
  96. dnt rt = ;
  97. if( nd->ls ) rt += query( nd->ls, a, b, c );
  98. if( nd->rs ) rt += query( nd->rs, a, b, c );
  99. if( nd->p.in(a,b,c) ) rt += nd->p.h;
  100. return rt;
  101. }
  102. int main() {
  103. scanf( "%d%d", &n, &m );
  104. for( int i=; i<=n; i++ )
  105. pts[i].read();
  106. cmp[] = cmpx;
  107. cmp[] = cmpy;
  108. root = build( , n, );
  109. fprintf( stderr, "\n" );
  110. for( int i=,a,b,c; i<=m; i++ ) {
  111. scanf( "%d%d%d", &a, &b, &c );
  112. printf( "%lld\n", query(root,a,b,c) );
  113. }
  114. }

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. 【技巧总结】Penetration Test Engineer[2]-Information gathering

    2.信息收集 信息收集是属于前期交互阶段所需要了解的问题. 2.1.前期交互内容 签署授权文件:首要要和受测试方签订授权协议. 划定范围:指定了一个二级域名作为测试目标,那么其他二级域名在测试范围内. ...

  2. CentOS6.6中安装telnet

    一.查看本机是否安装telnet rpm -qa | grep telnet 如果什么都不显示.说明你没有安装telnet 二.开始安装 yum install xinetd yum install ...

  3. iframe 同域下父子页面的通信

    //共同引用的JS文件 common.js ; (function (window, $) { $(function ($) { window.trip = window.trip || {}; wi ...

  4. c++ 类的构造顺序

    在单继承的情况下,父类构造先于子类,子类析构先于父类,例: class A { public: A() { cout << "A" << endl; } ~ ...

  5. js实现ctrl+v粘贴图片或是截图

    浏览器环境:谷歌浏览器 1.ctrl+v粘贴图片都是监听paste时间实现的,复制的数据都存在clipboardData下面,虽然打印显示数据长度为0,但是还是可以获取数据的 2.打印clipboar ...

  6. 日期时间设置 "2018-05-04T16:36:23.6341371+08:00" 格式

    using System;using System.Collections.Generic;using System.Globalization;using System.Text; namespac ...

  7. Java HashCode详解

    一.为什么要有Hash算法 Java中的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素是否重复应该依据什 ...

  8. 编写组件TComponent published $M+ 问题

    报错如下: PUBLISHED caused RTTI ($M+) to be added to type 修改成下面这样之后: 解决问题 方法: 来自:http://www.cnblogs.com/ ...

  9. C++有super关键字么?

    很多人在学习Java之后,看到Java里面有super关键字,用来表示父类,那么C++里面有super关键字么? 答案是否定的.这也很容易理解,C++由于支持多继承,所以假设存在super关键字,那么 ...

  10. 更改MyEclipse中的src目录的浏览方式

    看到这个标题,有人可能不会明白,这里先看张图: 右边的图就是我们要更改的样子,有的时候我们做项目需要看下目录的层次,于是使用了Navigator的那个视图,其实常用的这种包视图也可以变成那种样式. 这 ...