【BZOJ2850】巧克力王国 [KD-tree]
巧克力王国
Time Limit: 60 Sec Memory Limit: 512 MB
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 5
3 1 4
2 2 1
2 1 6
1 3 5
1 3 7
Sample Output
0
4
HINT
1 <= n, m <= 50000,1 <= 10^9,-10^9 <= a, b, x, y <= 10^9。
Main idea
每个点(x,y)以及价值,对于每个询问给定A,B,C。对于一个点,若A*x+B*y<C则可以获得该点的价值,问每个点可以得到的价值总和。
Solution
看到这种在平面上的题,我们显然想到了KD-tree。
因为可以离线,所以我们可以直接在建树的时候运用nth_element函数让它平衡。
对于每个点记录子树的最大最小的x与y以及总价值,然后KD-tree建树建完之后,查询的时候,如果所有情况都<C,我们就可以直接取走这个子树里面所有的值,如果存在可能的可能性就往下走。
PS:nth_element: 将一段序列从中间分开,给定的一个值放在中间(我们取中间的值即可),剩下两边排放,效率O(n) 。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<map>
using namespace std; typedef long long s64; const int ONE=;
const int INF=; int n,m;
int x,y,A,B;
s64 C,h;
int root;
s64 Ans;
int Ran; struct power
{
int x,y,l,r;
int maxx,maxy;
int minx,miny;
s64 val,sum;
}a[ONE]; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} namespace KD
{
void Update(int i)
{
a[i].sum=a[i].val;
if(a[i].l)
{
a[i].sum+=a[a[i].l].sum;
a[i].minx=min(a[i].minx,a[a[i].l].minx); a[i].miny=min(a[i].miny,a[a[i].l].miny);
a[i].maxx=max(a[i].maxx,a[a[i].l].maxx); a[i].maxy=max(a[i].maxy,a[a[i].l].maxy);
}
if(a[i].r)
{
a[i].sum+=a[a[i].r].sum;
a[i].minx=min(a[i].minx,a[a[i].r].minx); a[i].miny=min(a[i].miny,a[a[i].r].miny);
a[i].maxx=max(a[i].maxx,a[a[i].r].maxx); a[i].maxy=max(a[i].maxy,a[a[i].r].maxy);
}
} int cmp(const power &a,const power &b)
{
if(Ran) return a.x<b.x; return a.y<b.y;
} int Build(int l,int r,int T)
{
int mid=(l+r)/;
Ran=T;
nth_element(a+l,a+mid,a+r+,cmp);
if(l<mid) a[mid].l = Build(l,mid-,T^);
if(mid<r) a[mid].r = Build(mid+,r,T^);
Update(mid);
return mid;
}
} int PD(int x,int y)
{
return (s64)A*x+(s64)B*y < C ;
} int Check(int i)
{
int res=;
res+= PD(a[i].minx,a[i].miny);
res+= PD(a[i].minx,a[i].maxy);
res+= PD(a[i].maxx,a[i].miny);
res+= PD(a[i].maxx,a[i].maxy);
return res;
} void Query(int i)
{
if(PD(a[i].x,a[i].y)) Ans+=a[i].val;
if(a[i].l)
{
int Record=Check(a[i].l);
if(Record==) Ans+=a[a[i].l].sum;
else if(Record) Query(a[i].l);
}
if(a[i].r)
{
int Record=Check(a[i].r);
if(Record==) Ans+=a[a[i].r].sum;
else if(Record) Query(a[i].r);
}
} int main()
{
n=get(); m=get();
for(int i=;i<=n;i++) a[i].minx=a[i].miny=INF;
for(int i=;i<=n;i++)
{
x=get(); y=get(); scanf("%lld",&h);
a[i].val=h;
a[i].x=a[i].minx=a[i].maxx=x;
a[i].y=a[i].miny=a[i].maxy=y;
}
root=KD::Build(,n,); while(m--)
{
A=get(); B=get(); scanf("%lld",&C);
Ans=;
Query(root);
printf("%lld\n",Ans);
} }
【BZOJ2850】巧克力王国 [KD-tree]的更多相关文章
- P4475 巧克力王国 k-d tree
思路:\(k-d\ tree\) 提交:2次 错因:\(query\)时有一个\(mx\)误写成\(mn\)窝太菜了. 题解: 先把\(k-d\ tree\)建出来,然后查询时判一下整个矩形是否整体\ ...
- Bzoj2850 巧克力王国
Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 505 Solved: 204 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但 ...
- bzoj2850巧克力王国
巧克力王国 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 861 Solved: 325[Submit][Status][Discuss] Desc ...
- [bzoj2850]巧克力王国_KD-Tree
巧克力王国 bzoj-2850 题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c.求所有ax+by<=c的巧克 ...
- 【kd-tree】bzoj2850 巧克力王国
分四种情况讨论:a,b>=0 a,b<0 a>=0,b<0 a<0,b>=0 然后每次检验是否进入一个矩形框 或者 是否直接利用这个矩形框的答案 仅仅利用两个对角的 ...
- bzoj 2850: 巧克力王国 K-D树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2850 题解 对于每个人,我们发现它能够接受的巧克力中 如果对参数分别讨论,那么一定是一个连 ...
- bzoj 2850 巧克力王国 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询: 要注意值有负,所以不是直 ...
- 【BZOJ2850】巧克力王国 KDtree
[BZOJ2850]巧克力王国 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块巧克力,我们设 ...
- 洛谷P4475 巧克力王国
洛谷P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的. 但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 x 和 y 为 ...
随机推荐
- Martin Fowler关于IOC和DI的文章(原版)
Inversion of Control Containers and the Dependency Injection pattern In the Java community there's b ...
- ACM 第十五天
计算几何基础 练习题 C - Wasted Time Mr. Scrooge, a very busy man, decided to count the time he wastes on all ...
- Windows SDK 非模态对话框的消息处理
在SDK中使用非模态对话框时的几个问题: 1.为什么要调用IsDialogMessage?? 2.非模态对话框与主窗口有什么区别? 3.如果不调用IsDialogMessage,消息能不能传递到对话框 ...
- [计算机网络] 互联网协议栈(TCP/IP参考模型)各层的主要功能及相应协议
应用层:提供用户与网络间的接口.----HTTP.FTP.SMTP 运输层:进程到进程间的数据传输.---TCP.UDP 网络层:主机到主机之间的数据传输.---IP.选路协议 数据链路层:相邻结点之 ...
- 第70天:jQuery基本选择器(一)
一.jQuery基本选择器 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化javascript开发 jQuery能做的javascipt都能做到,而javascri ...
- [SCOI2007]组队 差分
题面:[SCOI2007]组队 题解: 一开始固定H然后找性质找了很久也没有找到任何有用的东西...... 然后大佬告诉我一个神奇的方法... 首先我们化一波式子: 设$H$表示高度的最小值,$V$表 ...
- BZOJ2816:[ZJOI2012]网络——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2816 https://www.luogu.org/problemnew/show/P2173 有一 ...
- [Leetcode] combination sum ii 组合之和
Given a collection of candidate numbers ( C ) and a target number ( T), find all unique combinations ...
- 洛谷 P2757 [国家集训队]等差子序列 解题报告
P2757 [国家集训队]等差子序列 题目描述 给一个\(1\)到\(N\)的排列\(\{A_i\}\),询问是否存在 \[1 \le p_1<p_2<p_3<p_4<p_5& ...
- React生命周期的变化
1.ES6语法的引入,砍掉了getDefaultProps和getInitialState getDefaultProps 使用 static default={}的方式代替getInitialSta ...