【BZOJ2850】巧克力王国

原创 2016年04月24日 08:42:39

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个人所能接受的巧克力的美味值之和。
Sample Input

3 3

1 2 5

3 1 4

2 2 1

2 1 6

1 3 5

1 3 7
Sample Output

5

0

4
HINT

1 <= n, m <= 50000,1 <= 10^9,-10^9 <= a, b, x, y <= 10^9。

Source

Violet 0

如果整个矩阵的点都不会超过限制,那可以直接获取矩阵答案
否则就递归

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 50010
#define Dnum 2
#define LL long long
#define GET (ch>='0'&&ch<='9')
using namespace std;
inline void in(int &x)
{
    char ch=getchar();x=0;int flag=1;
    while (!GET)    flag=ch=='-'?-1:1,ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();x*=flag;
}
inline void llin(LL &x)
{
    char ch=getchar();x=0;int flag=1;
    while (!GET)    flag=ch=='-'?-1:1,ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();x*=flag;
}
LL ans;
int n,m,root;
long long a,b,lim;
bool cmp_d;
struct KDtree
{
    int ch[2],d[Dnum],minn[Dnum],maxn[Dnum],val; LL sum;
    inline bool operator < (const KDtree& a)const   {   return d[cmp_d]<a.d[cmp_d]; }
    inline void init()  {   sum=val;    for (int i=0;i<Dnum;++i)    minn[i]=maxn[i]=d[i];   }
}tree[MAXN];
inline bool check(int x,int y)  {   return a*x+b*y<lim; }
inline int calc(int rt)
{
    int ret=0;
    ret+=check(tree[rt].minn[0],tree[rt].minn[1]);ret+=check(tree[rt].minn[0],tree[rt].maxn[1]);
    ret+=check(tree[rt].maxn[0],tree[rt].minn[1]);ret+=check(tree[rt].maxn[0],tree[rt].maxn[1]);
    return ret;
}
inline void push_up(int rt)
{
    tree[rt].sum=tree[rt].val;
    for (int i=0;i<2;++i)
        if (tree[rt].ch[i])
        {
            int x=tree[rt].ch[i];
            tree[rt].sum+=tree[x].sum;
            for (int j=0;j<2;++j)
                tree[rt].minn[j]=min(tree[rt].minn[j],tree[x].minn[j]),
                tree[rt].maxn[j]=max(tree[rt].maxn[j],tree[x].maxn[j]);
        }
}
int rebuild(int l=1,int r=n,bool d=0)
{
    cmp_d=d;int mid=(l+r)>>1;nth_element(tree+l,tree+mid,tree+r+1);
    tree[mid].init();
    if (l!=mid) tree[mid].ch[0]=rebuild(l,mid-1,d^1);
    if (r!=mid) tree[mid].ch[1]=rebuild(mid+1,r,d^1);
    return push_up(mid),mid;
}
void query(int rt=root)
{
    int l=tree[rt].ch[0],r=tree[rt].ch[1],cntl=l?calc(l):0,cntr=r?calc(r):0;
    if (check(tree[rt].d[0],tree[rt].d[1])) ans+=tree[rt].val;
    if (cntl==4)    ans+=tree[l].sum;
    else    if (cntl)   query(l);
    if (cntr==4)    ans+=tree[r].sum;
    else    if (cntr)   query(r);
}
int main()
{
    in(n);in(m);
    for (int i=1;i<=n;i++)  in(tree[i].d[0]),in(tree[i].d[1]),in(tree[i].val);
    for (root=rebuild();m;m--)
    {
        llin(a);llin(b);llin(lim);ans=0;
        query();printf("%lld\n",ans);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CreationAugust/article/details/51231956

2850: 巧克力王国

题目链接题目大意:每个点(x,y)以及价值,对于每个询问给定A,B,C。对于一个点,若A*x+B*y...
  • Mmh2000
  • Mmh2000
  • 2018-01-30 09:32:05
  • 82

BZOJ2850 巧克力王国

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

【BZOJ2850】巧克力王国

Description巧克力王国里的巧克力都是由牛奶和可可做成的。但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力。对于每一块巧克力,我们设x和y为其牛奶和可可的含量。由于...
  • CreationAugust
  • CreationAugust
  • 2016-04-24 08:42:39
  • 826

[BZOJ2850]巧克力王国

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

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

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

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

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

BZOJ2850: 巧克力王国

KD树裸题很久以前就会打了但是一直没遇到裸题 今天刚好交一发感觉不是很懂删除的那一套理论QWQ#include #include #include #include #include using n...
  • liutian429073576
  • liutian429073576
  • 2016-04-12 20:42:02
  • 332

bzoj2850: 巧克力王国 kd-tree

裸kd-tree,注意估价函数的写法,每个点记个sum。 #include #include #include #include using namespace std; #define l...
  • IED98
  • IED98
  • 2015-07-13 09:29:39
  • 684

bzoj2850 巧克力王国

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

[bzoj2850]2850: 巧克力王国

kd-tree
  • youhavepeople
  • youhavepeople
  • 2017-08-13 15:13:40
  • 183
收藏助手
不良信息举报
您举报文章:【BZOJ2850】巧克力王国
举报原因:
原因补充:

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