[HZOJ10420]计算
[HZOJ10420]计算
题目
给定一个数列,第i个位置包含两个数ai,bi
每次询问给出x,y
求数列ai*x+bi*y的最大值
输入所有数为自然数,在int范围内
INPUT
第一行为n,m。n为数列长度,m为询问个数。
接下来n行,每行两个数,代表ai,bi
接下来m行,每行两个数,代表x,y
OUTPUT
共m行,每行输出一个答案
SAMPLE
INPUT
3 3
1 5
9 0
9 1
4 4
1 1
3 4
OUTPUT
40
10
31
解题报告
首道估值线段树留念
首先,我们看题目,输入所有数据为自然数,自然数意味着不会有负数,那么,我们就可以确定,$a$和$b$越大,答案也就可能越大
剩下的就是如何找到准确的最大值了
我们可以用线段树处理出来每个区间的最大的$a$和$b$,然后,对于每一个询问,我们在线段树中进行搜索,我们可以用这个区间最大的$a$和$b$来限制搜索的范围,具体做法:
对于每一次搜索,我们先瞎XX搜到某一个子节点(一般来说是第一个子节点,根据线段树的实现而定),获得一个准确的$ans$值,然后,我们在搜索的时候,假如获得的该区间最大的$a$和$b$所计算出来的函数值都没有当前的$ans$大,我们可以直接舍弃该区间,这样下去,我们得到的$ans$值一定是越来越大的,然后可以舍弃的区间也就越来越多,从而比$O(n)$枚举每一个$a$和$b$更快,更加优秀。最终也可以得到最优解
实现基本上就是线段树+$DFS$:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
typedef long long L;
struct node{
int l,r;
L maxa,maxb;
node *lch,*rch;
node():l(),r(),maxa(),maxb(),lch(NULL),rch(NULL){}
}a[],*root;
int n,m,cnt;
inline void pushup(node *rt){
rt->maxa=max(rt->lch->maxa,rt->rch->maxa);
rt->maxb=max(rt->lch->maxb,rt->rch->maxb);
}
inline void build(int l,int r,node *rt){
rt->l=l,rt->r=r;
if(l==r){
rt->maxa=read(),rt->maxb=read();
return;
}
rt->lch=&a[++cnt],rt->rch=&a[++cnt];
int mid((l+r)>>);
build(l,mid,rt->lch);
build(mid+,r,rt->rch);
pushup(rt);
}
inline L query_a(int l,int r,node *rt){
if(l<=rt->l&&rt->r<=r)
return rt->maxa;
int mid((rt->l+rt->r)>>);
L ret(-0x7fffffff);
if(l<=mid)
ret=max(ret,query_a(l,r,rt->lch));
if(mid<r)
ret=max(ret,query_a(l,r,rt->rch));
return ret;
}
inline L query_b(int l,int r,node *rt){
if(l<=rt->l&&rt->r<=r)
return rt->maxb;
int mid((rt->l+rt->r)>>);
L ret(-0x7fffffff);
if(l<=mid)
ret=max(ret,query_b(l,r,rt->lch));
if(mid<r)
ret=max(ret,query_b(l,r,rt->rch));
return ret;
}
L ans;
inline void dfs(L x,L y,node *rt){
if(rt->l==rt->r){
ans=max(ans,x*(rt->maxa)+y*(rt->maxb));
return;
}
L ans1(x*(rt->lch->maxa)+y*(rt->lch->maxb)),ans2(x*(rt->rch->maxa)+y*(rt->rch->maxb));
if(ans1>ans)
dfs(x,y,rt->lch);
if(ans2>ans)
dfs(x,y,rt->rch);
}
int main(){
n=read(),m=read();
root=&a[++cnt];
build(,n,root);
for(int i=;i<=m;++i){
L x(read()),y(read());
ans=-0x7fffffff;
dfs(x,y,root);
printf("%lld\n",ans);
}
}
[HZOJ10420]计算的更多相关文章
- 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧
记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- C语言 · 薪水计算
问题描述 编写一个程序,计算员工的周薪.薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水.如果员工工作的时间在40 到50 ...
- C语言 · 阶乘计算 · 基础练习
问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表 ...
- C语言 · 最大值与最小值计算
输入11个整数,计算它们的最大值和最小值. 样例输入 0 1 2 3 4 5 6 7 8 9 10 样例输出 10 0 #include<stdio.h> int main(){ ]; ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- SQL Server-聚焦计算列持久化(二十一)
前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
随机推荐
- bzoj 3721 Final Bazarek
题目大意: n个数 选k个使和为奇数且最大 思路: 可以先将这n个数排序 然后先去最大的k个数 若和为奇数则直接输出 为偶数可以用没选的最大的奇数替换选了的最小的偶数或用没选的最大的偶数替换选了的最小 ...
- openStack Packages yum upgrade
依赖关系解决 ============================================================================================= ...
- es6 import 与 export
1.export 命令 export 命令用于规定模块的对外接口. 一个模块就是一个独立的文件.该文件内部所有的变量,外部无法获取.要想外部能够读取模块内部的某个变量,就必须使用 export 关键字 ...
- Spring思维课程导图——bean属性的设置
- [转]linux之top命令
转自:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html 简介 top命令是Linux下常用的性能分析工具,能够实时显示系 ...
- StackOverflowError&OutOfMemoryError区别
在Java虚拟机规范中,针对内存分配规定两种异常状况,即StackOverflowError和OutOfMemoryError. StackOverflowError:当线程请求的内存大小大于所配置的 ...
- 《Java编程的逻辑》第一部分 编程基础与二进制
- JS——筋斗云案例
需求: 1.鼠标移动到哪里,云彩移动到哪里 2.鼠标离开,云彩回到原点 3.鼠标离开,云彩回到之前点击的地方 <!DOCTYPE html> <html lang="en& ...
- nested exception is java.io.FileNotFoundException: class path resource [jdbc.properties] cannot be opened because it does not exist
Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [j ...
- 用nginx实现分布式限流
1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可 ...