题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850

只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询;

要注意值有负,所以不是直接看 min 和 max 的组合,而是各种都试一遍;

pushup 时不要把 sum 累加写在循环里...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
int const xn=50005;
int n,rt,cnt,dm,c[xn][2];
ll ans,A,B,C;
struct N{ll mn[2],mx[2],p[2],ys,sum;}t[xn],a[xn];
ll rd()
{ll ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret;
}
ll Min(ll x,ll y){return x<y?x:y;}
ll Max(ll x,ll y){return x<y?y:x;}
bool cmp(N x,N y){return x.p[dm]<y.p[dm];}
void turn(int x,N v)
{for(int i=0;i<2;i++)t[x].mn[i]=t[x].mx[i]=t[x].p[i]=v.p[i];t[x].sum=t[x].ys=v.sum;
}
void pushup(int x)
{int ls=c[x][0],rs=c[x][1]; t[x].sum=t[x].ys;for(int i=0;i<2;i++){if(ls)t[x].mn[i]=Min(t[x].mn[i],t[ls].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[ls].mx[i]);if(rs)t[x].mn[i]=Min(t[x].mn[i],t[rs].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[rs].mx[i]);}if(ls)t[x].sum+=t[ls].sum; if(rs)t[x].sum+=t[rs].sum;//
}
void build(int &x,int l,int r,int nw)
{x=++cnt; dm=nw;nth_element(a+l,a+mid,a+r+1,cmp);turn(x,a[mid]);if(mid>l)build(c[x][0],l,mid-1,nw^1);if(mid<r)build(c[x][1],mid+1,r,nw^1);pushup(x);
}
//bool in(int x){return (ll)t[x].mx[0]*A+(ll)t[x].mx[1]*B<C;}
//bool out(int x){return (ll)t[x].mn[0]*A+(ll)t[x].mn[1]*B>=C;}
int ck(int x)
{int ret=0;ret+=((t[x].mn[0]*A+t[x].mn[1]*B)<C);ret+=((t[x].mn[0]*A+t[x].mx[1]*B)<C);ret+=((t[x].mx[0]*A+t[x].mn[1]*B)<C);ret+=((t[x].mx[0]*A+t[x].mx[1]*B)<C);return ret;
}
void query(int x)
{if(t[x].p[0]*A+t[x].p[1]*B<C)ans+=t[x].ys;//!int ls=c[x][0],rs=c[x][1];if(ls){int d=ck(ls);if(d==4)ans+=t[ls].sum; else if(d)query(ls);}if(rs){int d=ck(rs);if(d==4)ans+=t[rs].sum; else if(d)query(rs);}
}
int main()
{n=rd(); int m=rd();for(int i=1;i<=n;i++)a[i].p[0]=rd(),a[i].p[1]=rd(),a[i].sum=rd();build(rt,1,n,0);for(int i=1;i<=m;i++){A=rd(); B=rd(); C=rd(); ans=0;query(rt); printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/10150132.html

bzoj 2850 巧克力王国 —— K-D树相关推荐

  1. 巧克力王国 BZOJ 2850

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

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

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

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

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

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

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

  5. bzoj 3685 普通van Emde Boas树(坑)

    3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1758 Solved: 563 [Submit][Stat ...

  6. PCL之K维树--KD-tree

    原理:KD-tree 又称 K 维树是计算机科学中使用的一种数据结构,用来组织表示 K 维空间中点集合.它是一种带有其他约束条件的二分查找树.KD-tree对于区间和近邻搜索十分有用.我们为了达到目的 ...

  7. LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况

    LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是 ...

  8. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  9. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

最新文章

  1. 今晚中科院刘永鑫报告:宏基因组数据分析的机遇与挑战
  2. android TextView显示文字和图片
  3. 快速搭建LNMP(1 )
  4. EnterpriseLibrary数据访问(4)使用数据访问器接收数据
  5. Unable to read TLD META-INF/c.tld from JAR file
  6. 2019年失业以后,他们都经历了什么?
  7. SAP常用TCODE
  8. 使用openlayers投影阿伯斯(Albers)
  9. 企业个人所得税网上申报系统_增值税、企业所得税、个人所得税申报难点梳理...
  10. 大型商超连锁企业5大核心业务、20+文件电子签场景
  11. 樱花树下的欢笑---2012春西安交大樱花节
  12. html画圆圈加感叹号,感叹号怎么打 拜托了是两个并在一起的叹号,
  13. Linux下使用clang-format格式化C++代码
  14. 如何使用git上传项目至GitHub repository
  15. 阅读笔记:3D visual discomfort predictor based on subjective perceived-constraint sparse representation
  16. 【Idea】Process finished with exit code 0 是什么意思?
  17. matlab信号时序图,怎么看时序图,电路原理图(转)
  18. 智能开关继电器-选型篇2
  19. 一个长二进制串,求除3的余数
  20. C语言包含特殊寄存器文件ch,c语言第二次实验报告 - osc_zfz30hgc的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. linux进程阻塞例子,一个Linux守候进程例子
  2. SQLi Labs Less-1 联合注入+报错注入
  3. 华为AP3010DN-AGN升级为胖AP
  4. Leave the world behind,山巅雪莲的再次绽放
  5. 数据港:专业数据中心服务提供商
  6. java多线程具体总结
  7. git学习资料及心得
  8. CentOS 7运维管理笔记(5)----源代码安装Apache 2.4,搭建LAMP服务器
  9. nginx的配置笔记
  10. 打造IOS移动***测试平台