Description

巧克力王国里的巧克力都是由牛奶和可可做成的。但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜
欢过于甜的巧克力。对于每一块巧克力,我们设x和y为其牛奶和可可的含量。由于每个人对于甜的程度都有自己的
评判标准,所以每个人都有两个参数a和b,分别为他自己为牛奶和可可定义的权重,因此牛奶和可可含量分别为x
和y的巧克力对于他的甜味程度即为ax + by。而每个人又有一个甜味限度c,所有甜味程度大于等于c的巧克力他都
无法接受。每块巧克力都有一个美味值h。现在我们想知道对于每个人,他所能接受的巧克力的美味值之和为多少

Input

第一行两个正整数n和m,分别表示巧克力个数和询问个数。接下来n行,每行三个整数x,y,h,含义如题目所示。再
接下来m行,每行三个整数a,b,c,含义如题目所示。

Output

输出m行,其中第i行表示第i个人所能接受的巧克力的美味值之和。

题解: 关键还是在于启发式估价函数.
如果当前点所维护的矩形的极限大的 $ax+by$ 小于等于 $c$ ,说明全部符合要求.
如果极限小值都不符合要求,说明整个矩形都不合法,返回 $0$ 即可.

  1. #include<bits/stdc++.h>
  2. #define maxn 100000
  3. #define inf 1000000008
  4. #define mid ((l+r)>>1)
  5. #define ll long long
  6. #define lson (t[x].ch[0])
  7. #define rson (t[x].ch[1])
  8. using namespace std;
  9. void setIO(string s)
  10. {
  11. string in=s+".in";
  12. freopen(in.c_str(),"r",stdin);
  13. }
  14. int n,Q,d;
  15. ll C, A[4];
  16. struct Node
  17. {
  18. int minv[2],maxv[2],p[2],ch[2];
  19. ll sumv,w;
  20. }t[maxn];
  21. bool cmp(Node a,Node b)
  22. {
  23. return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];
  24. }
  25. void pushup(int x,int y)
  26. {
  27. t[x].minv[0]=min(t[x].minv[0], t[y].minv[0]);
  28. t[x].maxv[0]=max(t[x].maxv[0], t[y].maxv[0]);
  29. t[x].minv[1]=min(t[x].minv[1], t[y].minv[1]);
  30. t[x].maxv[1]=max(t[x].maxv[1], t[y].maxv[1]);
  31. t[x].sumv+=t[y].sumv;
  32. }
  33. int build(int l,int r,int o)
  34. {
  35. d=o;
  36. nth_element(t+l,t+mid,t+1+r,cmp);
  37. t[mid].minv[0]=t[mid].maxv[0]=t[mid].p[0];
  38. t[mid].minv[1]=t[mid].maxv[1]=t[mid].p[1];
  39. t[mid].ch[0]=t[mid].ch[1]=0;
  40. t[mid].sumv=t[mid].w;
  41. if(mid>l)
  42. {
  43. t[mid].ch[0]=build(l,mid-1,o^1);
  44. pushup(mid,t[mid].ch[0]);
  45. }
  46. if(r>mid)
  47. {
  48. t[mid].ch[1]=build(mid+1,r,o^1);
  49. pushup(mid,t[mid].ch[1]);
  50. }
  51. return mid;
  52. }
  53. ll qmin(int x,ll a,ll b)
  54. {
  55. ll ans=0;
  56. for(int i=0;i<2;++i)
  57. {
  58. ans+=min(A[i]*1ll*t[x].minv[i], A[i]*1ll*t[x].maxv[i]);
  59. }
  60. return ans;
  61. }
  62. ll qmax(int x,ll a,ll b)
  63. {
  64. ll ans=0;
  65. for(int i=0;i<2;++i)
  66. {
  67. ans+=max(A[i]*1ll*t[x].minv[i], A[i]*1ll*t[x].maxv[i]);
  68. }
  69. return ans;
  70. }
  71. ll query(int x,ll a,ll b)
  72. {
  73. if(qmax(x, a, b) < C) return t[x].sumv;
  74. if(qmin(x, a, b) >= C) return 0;
  75. ll ans=0;
  76. if(1ll*t[x].p[0]*a+1ll*t[x].p[1]*b < C) ans+=t[x].w;
  77. if(lson) ans+=query(lson,a,b);
  78. if(rson) ans+=query(rson,a,b);
  79. return ans;
  80. }
  81. int main()
  82. {
  83. // setIO("input");
  84. scanf("%d%d",&n,&Q);
  85. for(int i=1;i<=n;++i) scanf("%d%d%lld",&t[i].p[0],&t[i].p[1],&t[i].w);
  86. int root=build(1,n,0);
  87. while(Q--)
  88. {
  89. scanf("%lld%lld%lld",&A[0],&A[1],&C);
  90. printf("%lld\n",query(root, A[0], A[1]));
  91. }
  92. return 0;
  93. }

  

BZOJ 2850: 巧克力王国 KDtree + 估价函数的更多相关文章

  1. bzoj 2850 巧克力王国——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 改一下估价即可.判断子树能否整个取或者是否整个不能取,时间好像就能行了? 因为有负数, ...

  2. bzoj 2850 巧克力王国

    bzoj 2850 巧克力王国 钱限题.题面可以看这里. 显然 \(x\) \(y\) 可以看成坐标平面上的两维,蛋糕可以在坐标平面上表示为 \((x,y)\) ,权值为 \(h\) .用 \(kd- ...

  3. bzoj 2850: 巧克力王国 K-D树

    题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2850 题解 对于每个人,我们发现它能够接受的巧克力中 如果对参数分别讨论,那么一定是一个连 ...

  4. bzoj 2850 巧克力王国 —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询: 要注意值有负,所以不是直 ...

  5. 【BZOJ2850】巧克力王国 KDtree

    [BZOJ2850]巧克力王国 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块巧克力,我们设 ...

  6. 【BZOJ2850】巧克力王国 [KD-tree]

    巧克力王国 Time Limit: 60 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 巧克力王国里的巧克力都是由牛奶和 ...

  7. BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 1000000000 using namespace std; ...

  8. BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...

  9. 【BZOJ】【2850】【Violet 0】巧克力王国

    KD-Tree 问平面内在某条直线下方的点的权值和 我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$... 然而这并不对啊…… ...

随机推荐

  1. HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 Problem Description The Public Peace Commission ...

  2. linux ifconfig命令配置ip地址

    Linux下网卡命名规律:eth0,eth1. 第一块以太网卡.第二块. lo为环回接口,它的IP地址固定为127.0.0.1.掩码8位. 它代表你的机器本身.   ifconfig [Interfa ...

  3. js实现伪音乐盒

    支持快进 <div class="music-part"> <div class="box-bg"></div> <d ...

  4. 逆向工程之App脱壳

    http://www.cnblogs.com/ludashi/p/5725743.html iOS逆向工程之App脱壳 本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是 ...

  5. oc75--不可变字典NSDictionary

    // // main.m // NSDictionary // // #import <Foundation/Foundation.h> int main(int argc, const ...

  6. Timus 1146. Maximum Sum

    1146. Maximum Sum Time limit: 0.5 secondMemory limit: 64 MB Given a 2-dimensional array of positive ...

  7. dotnet core 文档链接

    The installation was successful The following were installed at C:\Program Files\dotnet • .NET Core ...

  8. C# 数据库访问

    C# 数据库访问 分类: C#学习笔记2011-07-05 11:26 515人阅读 评论(0) 收藏 举报 数据库c#datasettextboxcommandexception   目录(?)[+ ...

  9. 【Poj3241】Object Clustering

    Position: http://poj.org/problem?id=3241 List Poj3241 Object Clustering List Description Knowledge S ...

  10. luogu 3808 【模板】AC自动机(简单版)

    我太菜了 棒神%%% #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib ...