洛谷P4475 巧克力王国
题目描述
巧克力王国里的巧克力都是由牛奶和可可做成的。
但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力。
对于每一块巧克力,我们设 x 和 y 为其牛奶和可可的含量。
由于每个人对于甜的程度都有自己的评判标准,所以每个人都有两个参数 a 和 b ,分别为他自己为牛奶和可可定义的权重, 因此牛奶和可可含量分别为 x 和 y 的巧克力对于他的甜味程度即为 ax+by。
而每个人又有一个甜味限度 c ,所有甜味程度大于等于 c 的巧克力他都无法接受。
每块巧克力都有一个美味值 h 。
现在我们想知道对于每个人,他所能接受的巧克力的美味值之和为多少。
输入输出格式
输入格式:
第一行两个正整数 n 和 m ,分别表示巧克力个数和询问个数。
接下来n行,每行三个整数 x , y , h ,含义如题目所示。
再接下来 m 行,每行三个整数 a , b , c,含义如题目所示。
输出格式:
输出m行,其中第i行表示第i个人所能接受的巧克力的美味值之和。
输入输出样例
3 3
1 2 5
3 1 4
2 2 1
2 1 6
1 3 5
1 3 7
5
0
4
说明
对于100%的数据,$1<=n,m<=50000,-10^9<=a_i,b_i,x_i,y_i<=10^9$。
题解Here!
巧克力。。。不是凰么???
莫名的病娇既视感。。。
如果把那个$ax+by<c$看成半平面的话,这个成就成了平面上某一区域内所有点的点权和。
这种问题直接$K-D\ Tree$就好。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 50010
#define MAX (1LL<<60)
using namespace std;
int n,m,root;
bool sort_flag=false;
struct Point{
long long x,y,z;
friend bool operator <(const Point &p,const Point &q){
if(sort_flag)return p.y<q.y;
return p.x<q.x;
}
}point[MAXN],now;
struct Tree{
Point point;
long long minx,miny,maxx,maxy,val,sum;
int lson,rson;
}a[MAXN];
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
void pushup(int rt){
int lson=a[rt].lson,rson=a[rt].rson;
a[rt].sum=a[lson].sum+a[rson].sum+a[rt].val;
a[rt].maxx=max(a[rt].maxx,max(a[lson].maxx,a[rson].maxx));
a[rt].maxy=max(a[rt].maxy,max(a[lson].maxy,a[rson].maxy));
a[rt].minx=min(a[rt].minx,min(a[lson].minx,a[rson].minx));
a[rt].miny=min(a[rt].miny,min(a[lson].miny,a[rson].miny));
}
void buildtree(int l,int r,int &rt,int flag){
int mid=l+r>>1;
rt=mid;
sort_flag=flag;
nth_element(point+l,point+mid,point+r+1);
a[rt].point=point[mid];
a[rt].val=point[mid].z;
a[rt].maxx=a[rt].minx=point[mid].x;
a[rt].maxy=a[rt].miny=point[mid].y;
if(l<mid)buildtree(l,mid-1,a[rt].lson,flag^1);
if(mid<r)buildtree(mid+1,r,a[rt].rson,flag^1);
pushup(rt);
}
inline bool check(int rt){
return ((a[rt].point.x*now.x+a[rt].point.y*now.y)<now.z);
}
inline long long max_dis(int rt){
long long x,y;
x=max(a[rt].minx*now.x,a[rt].maxx*now.x);
y=max(a[rt].miny*now.y,a[rt].maxy*now.y);
return x+y;
}
inline long long min_dis(int rt){
long long x,y;
x=min(a[rt].minx*now.x,a[rt].maxx*now.x);
y=min(a[rt].miny*now.y,a[rt].maxy*now.y);
return x+y;
}
long long query(int rt){
long long dis=max_dis(rt);
if(dis<now.z)return a[rt].sum;
dis=min_dis(rt);
if(dis>=now.z)return 0;
long long ans=0;
if(check(rt))ans+=a[rt].val;
if(a[rt].lson)ans+=query(a[rt].lson);
if(a[rt].rson)ans+=query(a[rt].rson);
return ans;
}
void work(){
while(m--){
now.x=read();now.y=read();now.z=read();
printf("%lld\n",query(root));
}
}
void init(){
n=read();m=read();
a[0].maxx=a[0].maxy=-MAX;
a[0].minx=a[0].miny=MAX;
for(int i=1;i<=n;i++){point[i].x=read();point[i].y=read();point[i].z=read();}
buildtree(1,n,root,0);
}
int main(){
init();
work();
return 0;
}
洛谷P4475 巧克力王国的更多相关文章
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- 洛谷4475 巧克力王国(KD-Tree + 维护子树和)
(嘤嘤嘤 又是一个自闭了一晚上的题) qwq果然不是平面上的点的问题,也可以直接用KDTree打暴力 我们对于巧克力直接建kdtree 维护一个\(mx[i],mn[i]\) 但是有一个非常不友好的事 ...
- 洛谷P2706 巧克力
题目背景 王7的生日到了,他的弟弟准备送他巧克力. 题目描述 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒,某些位置上被洗劫并 ...
- 洛谷—— P2183 巧克力
https://www.luogu.org/problemnew/show/P2183 题目描述 佳佳邀请了M个同学到家里玩.为了招待客人,她需要将巧克力分给她的好朋友们.她有N(1<=N< ...
- 洛谷——P2706 巧克力
P2706 巧克力 题目背景 王7的生日到了,他的弟弟准备送他巧克力. 题目描述 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒 ...
- P4475 巧克力王国(KDTree)
传送门 首先可以把约束条件看成一条直线,然后每个巧克力看成一个点,求给定区域内的点权和 用KDTree,每次判断一下当前矩形是否整个都在里面或都在外面,是的话直接返回,否则的话递归 注意,必须该矩形四 ...
- [洛谷P2183]巧克力
题目大意:有n块巧克力,每块巧克力有一个大小.巧克力可以切成若干份.现在要你切成大小相等的m块,且尽可能大.求这个大小. 解题思路:我们二分巧克力切成的大小,然后计算能切成多少块,判断即可.由于最大的 ...
- 洛谷 P2183 巧克力
P2183 巧克力 题目描述 佳佳邀请了M个同学到家里玩.为了招待客人,她需要将巧克力分给她的好朋友们.她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*X ...
- p4475 巧克力王国
传送门 分析 我们多维护一个值,代表某个点子树中所有点的权值和 于是如果某个点它的min和max乘a(/b)的值小于范围则直接把整个子树都加进去 估价函数就是这个点的子树中的理论最小值 代码 #inc ...
随机推荐
- [svc]linux文件特殊权限
这是老以前写的文章, 断断续续的可见那时候的心态还是不稳的. 生产使用: g1,g2组2个组的员工, g2组要访问g1组/home下的文件,rx权限. 这个setfacl就有用. 方法1: 修改普 ...
- 自己定义滑动删除item的ListView。
首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法 ...
- makefile之short函数
函数名称:排序函数-$(sort LIST) 函数功能:给字串"LIST"中的单词以首字母为准进行排序(升序),并去掉重复的单词. 返回值:空格分割的没有重复单词的字串. 函数说明 ...
- CCNA2.0笔记_OSI模型
OSI模型分为七层: –由下到上分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 特点:1.OSI模型每层都有自己的功能集:2.层与层之间相互独立又相互依靠:3.上层依赖于下层,下层 ...
- 如何让linux加载当前目录的动态库
debian从7.0开始支持multiarch,64位库的路径改到/usr/lib/x86_64-linux-gnu了,mint.ubuntu这些衍生版有没有跟着改我就不清楚了. deepin lin ...
- oracle分区的名称和值要一致
名称是01,后面的值也必须是02,不能是前面的是1,后面的是02,被这个问题困扰了好久.
- The Definitive Guide To Django 2 学习笔记(三) URLconfs 和松耦合
前面的例子体现了一个设计模式中的重要思想,松耦合. 不论我们是将/time/改成/current_time/,还是新建一个/another-time-page/同样指向views.py中的 curre ...
- 第二百二十九节,jQuery EasyUI,后台管理界面---后台登录
jQuery EasyUI,后台管理界面---后台登录 登录原理图 一,login.php,登录界面 <!DOCTYPE html> <html> <head> & ...
- 设置EntityFramework中decimal类型数据精度
EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度. e.g. 2.1999将会被保存为2.20 网上找到常见的方法为重写DbContext的OnMo ...
- js禁止别人查看源码
1.直接按F12 2.Ctrl+Shift+I查看 3.鼠标点击右键查看 4.Ctrl+u=view-source:+url 把以上三种状态都屏蔽掉就可以了,document有onkeydown(键盘 ...