[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 压入栈中, 这时遇到了运算符 + ...
随机推荐
- 67.员工职位变动js
1.员工职位jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- 数据库登陆失败原因: 未与信任 SQL Server 连接相关联
解决方案:用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联. 问题简述: 用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联. 说明: 执行当前 ...
- Android.mk添加第三方jar包(转载)
转自:www.cnblogs.com/hopetribe/archive/2012/04/23/2467060.html LOCAL_PATH:= $(call my-dir)include $(CL ...
- 枚举类enum的values()方法
value()方法可以将枚举类转变为一个枚举类型的数组,因为枚举中没有下标,我们没有办法通过下标来快速找到需要的枚举类,这时候,转变为数组之后,我们就可以通过数组的下标,来找到我们需要的枚举类.接下来 ...
- zhw大神线段树姿势
; i<; i++) tree[i][]=tree[i][]=i; ; i>=; i--) tree[i][]=tree[i+i][], tree[i][]=tree[i+i+][]; v ...
- [Swift通天遁地]八、媒体与动画-(8)使用开源类库快速实现位移动画
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Java注解Annotation的用法 - 自定义Annotation实现
Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据. Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取标 ...
- HyperLedger Fabric部署与链码解读
1.Fabric简介 Fabric是超级账本中的一个项目,用以推进区块链技术.和其他区块链类似,它也有一个账本,使用智能合约,且是一个参与者可以分别管理自身交易的系统.它是一个联盟链.Fabric与其 ...
- hihocode 编程练习赛17
1. f1 score 首先了解f1 score的计算方法, 我记得是学信息检索知道的, 然后简单处理就行. 由于我写的比较麻烦, 中间处理过程引入了一些除数为0的情况,导致错了很多次.其实是很简单的 ...
- 如何查看jdk的版本
(1)WINDOWS环境下 实验环境:WIN7 64bit 操作指令:cmd命令下输入“java -version” 参考如下:JDK1.7 (2).LINUX环境下 实验环境:CentOS 5.6 ...