分四种情况讨论:a,b>=0

a,b<0

a>=0,b<0

a<0,b>=0

然后每次检验是否进入一个矩形框 或者 是否直接利用这个矩形框的答案 仅仅利用两个对角的坐标进行更新即可。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
#define N 50001
#define INF 2147483647
#define KD 2//ά¶ÈÊý
int qp[KD];
ll lim;
int n,root,m;
bool dn;
struct Node
{
int minn[KD],maxx[KD],p[KD],w;
int ch[2];
ll sumv;
void Init()
{
for(int i=0;i<KD;++i)
minn[i]=maxx[i]=p[i];
sumv=(ll)w;
}
}T[N];
void Update(int rt)
{
for(int i=0;i<2;++i)
if(T[rt].ch[i])
{
T[rt].sumv+=T[T[rt].ch[i]].sumv;
for(int j=0;j<KD;++j)
{
T[rt].minn[j]=min(T[rt].minn[j],T[T[rt].ch[i]].minn[j]);
T[rt].maxx[j]=max(T[rt].maxx[j],T[T[rt].ch[i]].maxx[j]);
}
}
}
bool operator < (const Node &a,const Node &b){return a.p[dn]<b.p[dn];}
int Buildtree(int l=1,int r=n,bool d=0)
{
dn=d;
int m=(l+r>>1);
nth_element(T+l,T+m,T+r+1);
T[m].Init();
if(l!=m) T[m].ch[0]=Buildtree(l,m-1,d^1);
if(m!=r) T[m].ch[1]=Buildtree(m+1,r,d^1);
Update(m);
return m;
}
ll ans;
void Query0(int rt=root)//a>0,b>0
{
if((ll)T[rt].p[0] * (ll)qp[0] + (ll)T[rt].p[1] * (ll)qp[1] < lim)
ans+=(ll)T[rt].w;
for(int i=0;i<2;++i)
if(T[rt].ch[i] &&
(ll)T[T[rt].ch[i]].minn[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].minn[1] * (ll)qp[1] < lim)
{
if((ll)T[T[rt].ch[i]].maxx[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].maxx[1] * (ll)qp[1] < lim)
ans+=T[T[rt].ch[i]].sumv;
else
Query0(T[rt].ch[i]);
}
}
void Query1(int rt=root)//a>0,b<0
{
if((ll)T[rt].p[0] * (ll)qp[0] + (ll)T[rt].p[1] * (ll)qp[1] < lim)
ans+=(ll)T[rt].w;
for(int i=0;i<2;++i)
if(T[rt].ch[i] &&
(ll)T[T[rt].ch[i]].minn[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].maxx[1] * (ll)qp[1] < lim)
{
if((ll)T[T[rt].ch[i]].maxx[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].minn[1] * (ll)qp[1] < lim)
ans+=T[T[rt].ch[i]].sumv;
else
Query1(T[rt].ch[i]);
}
}
void Query2(int rt=root)//a<0,b>0
{
if((ll)T[rt].p[0] * (ll)qp[0] + (ll)T[rt].p[1] * (ll)qp[1] < lim)
ans+=(ll)T[rt].w;
for(int i=0;i<2;++i)
if(T[rt].ch[i] &&
(ll)T[T[rt].ch[i]].maxx[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].minn[1] * (ll)qp[1] < lim)
{
if((ll)T[T[rt].ch[i]].minn[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].maxx[1] * (ll)qp[1] < lim)
ans+=T[T[rt].ch[i]].sumv;
else
Query2(T[rt].ch[i]);
}
}
void Query3(int rt=root)//a<0,b<0
{
if((ll)T[rt].p[0] * (ll)qp[0] + (ll)T[rt].p[1] * (ll)qp[1] < lim)
ans+=(ll)T[rt].w;
for(int i=0;i<2;++i)
if(T[rt].ch[i] &&
(ll)T[T[rt].ch[i]].maxx[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].maxx[1] * (ll)qp[1] < lim)
{
if((ll)T[T[rt].ch[i]].minn[0] * (ll)qp[0] +
(ll)T[T[rt].ch[i]].minn[1] * (ll)qp[1] < lim)
ans+=T[T[rt].ch[i]].sumv;
else
Query3(T[rt].ch[i]);
}
}
int main()
{
// freopen("bzoj2850.in","r",stdin);
// freopen("bzoj2716.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d%d%d",&T[i].p[0],&T[i].p[1],&T[i].w);
Buildtree();
root=(1+n>>1);
for(int i=1;i<=m;++i)
{
ans=0;
scanf("%d%d%lld",&qp[0],&qp[1],&lim);
if(qp[0]>=0 && qp[1]>=0)
Query0();
else if(qp[0]>=0 && qp[1]<0)
Query1();
else if(qp[0]<0 && qp[1]>=0)
Query2();
else
Query3();
printf("%lld\n",ans);
}
return 0;
}

【kd-tree】bzoj2850 巧克力王国的更多相关文章

  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. [bzoj2850]巧克力王国_KD-Tree

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

  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. 洛谷P4475 巧克力王国

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

  8. 初涉k-d tree

    听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...

  9. BZOJ2820 - 巧克力王国

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

随机推荐

  1. 14.高度最小的BST

    题目描述 对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树. 给定一个有序序列int[] vals,请返回创建的二叉查找树的高度. 返回高度的代码如下: imp ...

  2. Linux:安装图形界面

    能连接网络的前提下,使用yum安装 yum groupinstall  -y "Desktop"yum groupinstall   -y "X Window Syste ...

  3. 树莓派B+上手小记--使用HDMI线连接显示器

    入手还算比较顺利,一开始使用网上下的别人精简的OS,发现ACT及PWR灯一直亮着,上网查说用HDMI连接显示器需要修改配置文件config.txt,但修改后情况依旧. 如果还是用官方的系统试试吧,上网 ...

  4. APK Downgrade Method working fine on LINE latest version 6.7.1

    Line is one of the most popular messaging Apps, especially in Asia. On March 3 I downgraded the app ...

  5. Windows下Python工具pip的安装

    1.打开pip的文档官网 https://pip.pypa.io/en/stable/ ,进入installation.在installation里,我们需要的是get-pip.py这个脚本. 选中后 ...

  6. Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  7. 正则验证:Pattern,Matcher

    public static void main(String[] args) { String regex="([a-z]{1})(\\d{2})"; String candida ...

  8. Maven实战(二)构建简单Maven项目

    上一节讲了maven的安装和配置,这一节我们来学习一下创建一个简单的Maven项目 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:gene ...

  9. Repeater控件 ---表格展示数据

    简介: Repeater控件是Web 服务器控件中的一个容器控件,它使您可以从页的任何可用数据中创建出自定义列表. Repeater 控件不具备内置的呈现功能,这表示用户必须通过创建模板为 Repea ...

  10. python生成器和迭代器

    生成器:具有生成能力的对象 迭代器:具有取值功能的对象 def func(): yield 1 yield 2 yield 3 ret = func() #func()函数体称为生成器 r=ret._ ...