巧克力王国 bzoj-2850

题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c。求所有ax+by<=c的巧克力价值和。

注释:$1\le n,n\le 5\cdot 10^4$。


想法:我们将巧克力的两个参数分别当作它的横纵坐标,然后对于每一次询问就可以转化成查询给定直线下的点的点权和。

对于这个问题,我们可以建立KD-Tree解决。

估价函数就是看这个矩形是不是都选或者都不选,否则的话,就遍历这个矩形。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50010
using namespace std;
typedef long long ll;
int d,root;
struct Node
{
ll c[2],p[2],maxn[2],minn[2],v,sum;
}a[N];
inline bool cmp(const Node &x,const Node &y)
{
return x.p[d]==y.p[d]?x.p[d^1]<y.p[d^1]:x.p[d]<y.p[d];
}
inline void pushup(int k,int s)
{
a[k].maxn[0]=max(a[k].maxn[0],a[s].maxn[0]);
a[k].minn[0]=min(a[k].minn[0],a[s].minn[0]);
a[k].maxn[1]=max(a[k].maxn[1],a[s].maxn[1]);
a[k].minn[1]=min(a[k].minn[1],a[s].minn[1]);
a[k].sum+=a[s].sum;
}
int build(int l,int r,int now)
{
int mid=(l+r)>>1;
d=now; nth_element(a+l,a+mid,a+r+1,cmp);
a[mid].maxn[0]=a[mid].minn[0]=a[mid].p[0];
a[mid].maxn[1]=a[mid].minn[1]=a[mid].p[1];
a[mid].sum=a[mid].v;
if(l<mid) a[mid].c[0]=build(l,mid-1,now^1),pushup(mid,a[mid].c[0]);
if(mid<r) a[mid].c[1]=build(mid+1,r,now^1),pushup(mid,a[mid].c[1]);
return mid;
}
int getdis(int k,ll x,ll y,ll z)
{
if(x >= 0 && y >= 0)
{
if(x*a[k].maxn[0]+y*a[k].maxn[1]<z) return 1;
if(x*a[k].minn[0]+y*a[k].minn[1]>=z) return -1;
}
else if(x < 0 && y >= 0)
{
if(x*a[k].minn[0]+y*a[k].maxn[1]<z) return 1;
if(x*a[k].maxn[0]+y*a[k].minn[1]>=z) return -1;
}
else if(x >= 0 && y < 0)
{
if(x*a[k].maxn[0]+y*a[k].minn[1]<z) return 1;
if(x*a[k].minn[0]+y*a[k].maxn[1]>=z) return -1;
}
else
{
if(x*a[k].minn[0]+y*a[k].minn[1]<z) return 1;
if(x*a[k].maxn[0]+y*a[k].maxn[1]>=z) return -1;
}
return 0;
}
ll query(int k,ll x,ll y,ll z)
{
int opt=getdis(k,x,y,z);
if(opt==1) return a[k].sum;
if(opt==-1) return 0;
ll ans=0;
if(x*a[k].p[0]+y*a[k].p[1]<z) ans+=a[k].v;
if(a[k].c[0]) ans+=query(a[k].c[0],x,y,z);
if(a[k].c[1]) ans+=query(a[k].c[1],x,y,z);
return ans;
}
int main()
{
int n,m;
ll x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].p[0],&a[i].p[1],&a[i].v);
root=build(1,n,0);
for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&x,&y,&z),printf("%lld\n",query(root,x,y,z));
return 0;
}

小结:这道题还挺裸的... ...

[bzoj2850]巧克力王国_KD-Tree的更多相关文章

  1. Bzoj2850 巧克力王国

    Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 505  Solved: 204 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但 ...

  2. bzoj2850巧克力王国

    巧克力王国 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 861  Solved: 325[Submit][Status][Discuss] Desc ...

  3. 【kd-tree】bzoj2850 巧克力王国

    分四种情况讨论:a,b>=0 a,b<0 a>=0,b<0 a<0,b>=0 然后每次检验是否进入一个矩形框 或者 是否直接利用这个矩形框的答案 仅仅利用两个对角的 ...

  4. P4475 巧克力王国 k-d tree

    思路:\(k-d\ tree\) 提交:2次 错因:\(query\)时有一个\(mx\)误写成\(mn\)窝太菜了. 题解: 先把\(k-d\ tree\)建出来,然后查询时判一下整个矩形是否整体\ ...

  5. 【BZOJ2850】巧克力王国 KDtree

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

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

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

  7. bzoj 2850 巧克力王国

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

  8. 洛谷P4475 巧克力王国

    洛谷P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的. 但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 x 和 y 为 ...

  9. BZOJ2820 - 巧克力王国

    原题链接 Description 给出个二维平面上的点,第个点为,权值为.接下来次询问,给出,求所有满足的点的权值和. Solution 对于这个点建一棵k-d树,子树维护一个子树和. 如果子树所代表 ...

随机推荐

  1. [Swift通天遁地]七、数据与安全-(7)创建文件浏览器:以可视化的方式浏览沙箱文件

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. centos语言设置

    . echo $LANG可以查看当前使用的系统语言 . 在终端输入 locale命令,如有zh cn 表示已经安装了中文 . 安装中文语言包yum groupinstall chinese-suppo ...

  3. sessionStorage 的使用

    sessionStorage 的使用: sessionStorage.removeItem("data"); sessionStorage.getItem("data&q ...

  4. node or gulp 使用

    ##MAC 升级node.js的方法 ###第一步,先查看本机node.js版本: $ node -v ###第二步,清除node.js的cache: $ sudo npm cache clean - ...

  5. DAO模式详解

    DAO模式 数据访问层(DAO): 数据的增.删.改.查操作: 业务逻辑层(service): 业务来往的操作,需要调用数据访问层则调用数据访问层,传递数据: 表现层(UI): 呈现数据,用户交互. ...

  6. 支付宝小程序日期选择组件datePicker封装

    github 地址 https://github.com/iocool/antminDatePicker 最近在做支付宝小程序(以下简称小程序)开发,发现小程序的日期选择组件很不好用,比如安卓和IOS ...

  7. SQL基本操作——GROUP BY

    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 实例:我们拥有下面这个 "Orders" 表 O_Id OrderDate O ...

  8. [Windows Server 2008] Ecshop安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:ECSHO ...

  9. 【译】x86程序员手册19-6.3.2数据访问的约束

    6.3.2 Restricting Access to Data  数据访问的约束 To address operands in memory, an 80386 program must load ...

  10. 使用whIle循环语句和变量打印九九乘法表

    -设置i变量declare @i int --设置j变量declare @j int --设置乘法表变量declare @chengfabiao varchar(1000)--给i,j,@chengf ...