BZOJ2850: 巧克力王国 kdtree

原创 2017年01月03日 15:15:46

题意:n个平面上的带权点,每次给出a,b,h,询问满足ax+by < h的点权和。
1 <= n, m <= 50000,其它10^9
kdtree划分矩形,显然若矩形四个顶点都在半平面内,则整个矩形在半平面内;四个顶点都在半平面外,则整个矩形在半平面外。
注意维护的是权值和,不是size

#include<cstdio>
#include<algorithm>
using std::nth_element;
typedef long long ll;
struct chok
{
    int p[2],v;
    chok(){}
    chok(int x,int y,int z):v(z){p[0]=x,p[1]=y;}
    inline int& operator [] (size_t x){return p[x];}
    inline const int& operator [] (size_t x) const {return p[x];}
};
inline int check(ll a,ll b,ll c,int x,int y)
{
    return a*x+b*y<c;
}
bool cmp;
inline bool fn(const chok &a,const chok &b)
{
    return a[cmp]<b[cmp];
}
inline void min(int &a,int b)
{
    if(b<a) a=b;
}
inline void max(int &a,int b)
{
    if(a<b) a=b;
}
struct node
{
    ll sum;
    chok p;
    int xn,yn,xm,ym;
    node *l,*r;
    node(const chok &p):sum(p.v),p(p),l(0),r(0),xn(p[0]),yn(p[1]),xm(p[0]),ym(p[1]){}
    inline void* operator new(size_t)
    {
        static unsigned char pool[50000*sizeof(node)];
        static node* s=(node*)pool;
        static size_t k=-1;
        return s+ ++k;
    }
    ll query(int a,int b,int c)
    {
        if(!this) return 0;
        int tot=check(a,b,c,xn,yn)+check(a,b,c,xn,ym)+check(a,b,c,xm,yn)+check(a,b,c,xm,ym);
        if(tot==4) return sum;
        if(!tot) return 0;
        ll res=0;
        if(check(a,b,c,p[0],p[1])) res+=p.v;
        return res+l->query(a,b,c)+r->query(a,b,c);
    }
    inline void up()
    {
        if(l) min(xn,l->xn),min(yn,l->yn),max(xm,l->xm),max(ym,l->ym),sum+=l->sum;
        if(r) min(xn,r->xn),min(yn,r->yn),max(xm,r->xm),max(ym,r->ym),sum+=r->sum;
    }
};
struct kdtree
{
    node *rt;
    node *build(chok* l,chok *r,bool k)
    {
        if(l==r) return 0;
        chok *mid=l+(r-l>>1);
        cmp=k;
        nth_element(l,mid,r,fn);
        node *kre=new node(*mid);
        kre->l=build(l,mid,!k);
        kre->r=build(mid+1,r,!k);
        kre->up();
        return kre;
    }
    kdtree(chok *a,int len):rt(build(a,a+len,0)){}
    inline ll query(int a,int b,int c)
    {
        return rt->query(a,b,c);
    }
};
int n,m;
chok choco[50000];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;++i)
    scanf("%d%d%d",&choco[i].p[0],&choco[i].p[1],&choco[i].v);
    kdtree tr(choco,n);
    for(int i=0;i<m;++i)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        printf("%lld\n",tr.query(a,b,c));
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

第八届蓝桥杯第九题分巧克力

标题: 分巧克力     儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。     小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。     为了公平起见,...
  • z956281507
  • z956281507
  • 2017年04月08日 15:19
  • 1563

卡尔曼滤波 -- 从推导到应用(二)

这部分主要是通过对第一部分中提到的匀加速小车模型进行位移预测。 先来看看状态方程能建立准确的时候,状态方程见第一部分分割线以后内容,小车做匀加速运动的位移的预测仿真如下。...
  • heyijia0327
  • heyijia0327
  • 2013年12月30日 11:08
  • 21102

(Relax DP1.4)UVA 10648 Chocolate Box(求将n个巧克力放在m个盒子中的概率)

/* * UVA_10648.cpp * * Created on: 2013年12月17日 * Author: Administrator */ #include #inc...
  • caihongshijie6
  • caihongshijie6
  • 2013年12月18日 19:56
  • 1210

[BZOJ2850]巧克力王国(kd-tree)

题目描述传送门题解需要注意的一点是因为有负数,所以不一定是最大的乘起来最大 所以四个都要判断一下 然后在kd-tree上维护一个sum就行了代码#include #include #include...
  • Clove_unique
  • Clove_unique
  • 2017年02月12日 18:38
  • 298

bzoj2850 巧克力王国

Description 巧克力王国里的巧克力都是由牛奶和可可做成的。但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力。对于每一块巧克力,我们设x和y为其牛奶和可可的含量。...
  • elijahqi
  • elijahqi
  • 2018年01月11日 23:03
  • 2

bzoj2850 巧克力王国(K-D tree)

这…kdtree反正能过???感觉K-D tree就像在空间中分块暴力一般x 好神呀x
  • Icefox_zhx
  • Icefox_zhx
  • 2018年01月11日 14:08
  • 37

BZOJ2850 巧克力王国

题目就是让你求满足ax+by 这个……KDT可以过,不要问我为什么 以后看到不会的二维平面问题是不是都可以上KDT然后相信可以过啊-_- #include #include #include #...
  • neither_nor
  • neither_nor
  • 2016年07月09日 10:24
  • 817

[BZOJ2850]巧克力王国(KD-tree)

喵喵喵眼见着自己的程序跑到37518ms特别兴奋地刷刷刷没想到竟然是个WA?
  • Blue_CuSO4
  • Blue_CuSO4
  • 2017年12月14日 14:46
  • 45

[BZOJ2850]巧克力王国

题目大意:二维平面里给出若干个点和若干个半平面,分别求在每个半平面内的点的点权和.这个用Kdtree也很好维护....
  • Zvezda_
  • Zvezda_
  • 2016年02月27日 22:07
  • 362

BZOJ 2850 巧克力王国

KDtree+思路
  • SenyeLicone
  • SenyeLicone
  • 2017年05月16日 22:59
  • 202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ2850: 巧克力王国 kdtree
举报原因:
原因补充:

(最多只允许输入30个字)