bzoj 2850 巧克力王国 —— K-D树
题目: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树相关推荐
- 巧克力王国 BZOJ 2850
巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- 【bzoj2850】巧克力王国 KD-tree
题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于每个人对于甜的程 ...
- [bzoj2850]巧克力王国_KD-Tree
巧克力王国 bzoj-2850 题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c.求所有ax+by<=c的巧克 ...
- bzoj 3685 普通van Emde Boas树(坑)
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1758 Solved: 563 [Submit][Stat ...
- PCL之K维树--KD-tree
原理:KD-tree 又称 K 维树是计算机科学中使用的一种数据结构,用来组织表示 K 维空间中点集合.它是一种带有其他约束条件的二分查找树.KD-tree对于区间和近邻搜索十分有用.我们为了达到目的 ...
- LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况
LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- BZOJ.4888.[TJOI2017]异或和(树状数组)
BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...
最新文章
- 今晚中科院刘永鑫报告:宏基因组数据分析的机遇与挑战
- android TextView显示文字和图片
- 快速搭建LNMP(1 )
- EnterpriseLibrary数据访问(4)使用数据访问器接收数据
- Unable to read TLD META-INF/c.tld from JAR file
- 2019年失业以后,他们都经历了什么?
- SAP常用TCODE
- 使用openlayers投影阿伯斯(Albers)
- 企业个人所得税网上申报系统_增值税、企业所得税、个人所得税申报难点梳理...
- 大型商超连锁企业5大核心业务、20+文件电子签场景
- 樱花树下的欢笑---2012春西安交大樱花节
- html画圆圈加感叹号,感叹号怎么打 拜托了是两个并在一起的叹号,
- Linux下使用clang-format格式化C++代码
- 如何使用git上传项目至GitHub repository
- 阅读笔记:3D visual discomfort predictor based on subjective perceived-constraint sparse representation
- 【Idea】Process finished with exit code 0 是什么意思?
- matlab信号时序图,怎么看时序图,电路原理图(转)
- 智能开关继电器-选型篇2
- 一个长二进制串,求除3的余数
- C语言包含特殊寄存器文件ch,c语言第二次实验报告 - osc_zfz30hgc的个人空间 - OSCHINA - 中文开源技术交流社区...