巧克力王国

Time Limit: 60 Sec  Memory Limit: 512 MB
Submit: 861  Solved: 325
[Submit][Status][Discuss]

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。

 
题解:
  这是一个二维平面问题,应该想到扫描线或者kdtree,
  但是发现对于扫描线,无法解决问题,因为限制是ax+by,所以对于每个询问是不一样的。
  所以是不行的,二kdtree是可以解决的,
  对于暴力只能够一个一个处理,如何一起处理是解决问题的关键,
  所以需要kdtree。
  时间复杂度,对于建树是T(n)=f(n)+aT(n/b)=O(n)+2T(n/2)
  所以得出复杂度是O(n log n)的
  然后对于询问是n^(1-1/k)是√n的,所以渐进复杂度是O(n√n)的。
 #include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio> #define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
ll A,B,C,ans;
int F,n,m,rt;
struct Node
{
int d[],mx[],mn[],v,l,r;
ll sum;
int& operator[](int x)
{
return d[x];
}
friend bool operator<(Node x,Node y)
{
return x[F]<y[F];
}
}p[];
bool check(int x,int y)
{
return A*x+B*y<C;
}
int cal(Node x)
{
int tmp=;
tmp+=check(x.mn[],x.mn[]);
tmp+=check(x.mx[],x.mn[]);
tmp+=check(x.mn[],x.mx[]);
tmp+=check(x.mx[],x.mx[]);
return tmp;
}
struct kd
{
Node t[];
void update(int p)
{
int l=t[p].l,r=t[p].r;
for (int i=;i<;i++)
{
t[p].mn[i]=t[p].mx[i]=t[p][i];
if (l) t[p].mn[i]=min(t[p].mn[i],t[l].mn[i]);
if (r) t[p].mn[i]=min(t[p].mn[i],t[r].mn[i]);
if (l) t[p].mx[i]=max(t[p].mx[i],t[l].mx[i]);
if (r) t[p].mx[i]=max(t[p].mx[i],t[r].mx[i]);
}
t[p].sum=t[p].v+t[l].sum+t[r].sum;
}
int build(int l,int r,int now)
{
F=now;
int mid=(l+r)>>;
nth_element(p+l,p+mid,p+r+);
t[mid]=p[mid];
if (l<mid) t[mid].l=build(l,mid-,now^);
if (r>mid) t[mid].r=build(mid+,r,now^);
update(mid);
return mid;
}
void query(int p)
{
int l=t[p].l,r=t[p].r;
if (check(t[p][],t[p][]))ans+=t[p].v;
int tl=,tr=;
if (l) tl=cal(t[l]);
if (r) tr=cal(t[r]);
if (tl==) ans+=t[l].sum;
else if (tl) query(l);
if (tr==) ans+=t[r].sum;
else if (tr) query(r);
}
}kd;
int main()
{
n=read(),m=read();
for (int i=;i<=n;i++)
p[i][]=read(),p[i][]=read(),p[i].v=read();
rt=kd.build(,n,);
while(m--)
{
A=read(),B=read(),C=read();
ans=;
kd.query(rt);
printf("%lld\n",ans);
}
}
 

bzoj2850巧克力王国的更多相关文章

  1. [bzoj2850]巧克力王国_KD-Tree

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

  2. Bzoj2850 巧克力王国

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

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

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

  4. 【BZOJ2850】巧克力王国 KDtree

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

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

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

  6. BZOJ2820 - 巧克力王国

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

  7. 洛谷 P4475 巧克力王国 解题报告

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

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

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

  9. bzoj 2850 巧克力王国

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

随机推荐

  1. mysqlsla安装和使用介绍

    安装mysqlsla源码路径:https://github.com/daniel-nichter/hackmysql.com源码存放路径:/usr/local/src1.获取源码如果没有git命令,请 ...

  2. POJ 3162 Walking Race (树的直径,单调队列)

    题意:给定一棵带边权的n个节点的树,首先要求出每个点的最长路,然后写成序列d[1],d[2]...d[n],然后求满足 区间最大值-区间最小值<=k 的最大区间长度为多少? 思路: 分两步进行: ...

  3. openstack v3 rest 访问

    1. openstack主要面向得是python为主得开发.目前java中嵌入openstack主要是通过rest接口访问 2. 下载一个postman的接口测试工具 3. openstack 中的服 ...

  4. 一个小笔记(5):A*算法

    A-Star算法是一种静态路网中求解最短路径最有效的直接搜索方法其实百科有 http://baike.baidu.com/link?url=CvmkWQIAmztYgMq3Nk1WyWkDiC0koV ...

  5. CPP-基础:String类

    已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String ...

  6. Codeforces Round #274 (Div. 2)-C. Exams

    http://codeforces.com/contest/479/problem/C C. Exams time limit per test 1 second memory limit per t ...

  7. 洛谷 P2668 斗地主

    毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...

  8. Spring框架context的注解管理方法之二 使用注解注入基本类型和对象属性 注解annotation和配置文件混合使用(半注解)

    首先还是xml的配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  9. 初遇Linux

    Ctrl+Alt+(F1-F6):切换虚拟终端 Ctrl+Alt:鼠标切换界面 $:普通用户登录后系统的提示符 #:root用户登录后系统的提示符 Linux命令 exit  用于退出目前的shell ...

  10. Ubuntu 18.04修改默认源

    安装Ubuntu 18.04后,使用国外源太慢了,修改为国内源会快很多. 修改阿里源为Ubuntu 18.04默认的源 备份/etc/apt/sources.list #备份 cp /etc/apt/ ...