洛谷P4837 养殖呆河马(线段树)
题目描述
作为养殖场的大佬,阳阳引进了养殖呆河马的技术,而且她有一个团队来研究呆河马的养殖技巧来制定养殖规划,并在今年购入了 1 只呆河马。她们制定了从今年(即第 0 年)到第 n−1年的养殖呆河马的计划。其中她们确定了一个繁殖系数 Xi,其中 Xi 代表着在第 i年,若第 iii 年年初时有h只呆河马,则第 i年年末(第 i+1 年年初)会有 h⋅Xi只呆河马,且这个时候养殖园可以杀掉一些呆河马赚钱,每只呆河马的可以赚到的利润为Pi
而每次阳阳会预估到总会有一些意外发生,因此她会对养殖的预测进行 m 次修改,且每次修改只会涉及一个 Xi 或Pi的修改。注意:修改是累加的,即每次涉及修改时都应该考虑之前的所有的修改。作为养殖场的场长阳阳,她肯定希望养殖呆河马可以得到收益最大,但是阳阳的养殖场的呆河马实在是太多了,她忙不过来了,因此需要你的帮忙。
你的任务是,输出她初始与每次修改后,养殖呆河马可以获取最大的利润。
输入格式
第一行为一个正整数 n,描述阳阳的规划的年数。
接下来一行,有 n 个正整数,第 i个数字为题中所描述的 Xi-1。
接下来一行,有 n 个正整数,第 i个数字为题中所描述的 Pi-1。
接下来一行,为 1 个正整数 m,描述阳阳修改计划的次数。
接下来 mmm 行,每行 3 个正整数 type, pos, val,若 type=1 则说明把 Xpos的值修改为 val,若type=2,则说明把Ppos的值修改为 val。
输出格式
输出 m+1行, 每行一个正整数。第 1 行输出在最初条件时, 养殖呆河马可获得最大的利润,接下来 m 行,分别输出每次修改后,养殖呆河马可获得最大的利润。
由于答案有可能会极大,因此你只需每次输出答案对 10的九次方取模后的结果。
思路
设F(n)表示第n天出售呆河马可以获得的利润,则有:
设
则有
处理出F(n)可以过前8个测试点。
然后在用枚举的方法可以过前16个测试点。
附上代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;const int maxn=5e5+12;
const int mod=1e9+7;
int n,x[maxn],y[maxn];static char _buffer[1024];
static int _currentChar = 0;
static int _charsNumber = 0;
static FILE *_inputFile, *_outputFile;struct Tree{int mx,num;double val,sum;
}tree[maxn<<2];void pushup(int now){if(tree[now<<1].val>tree[now<<1].sum+tree[now<<1|1].val){tree[now].val=tree[now<<1].val;tree[now].mx=tree[now<<1].mx;}else{tree[now].val=tree[now<<1].sum+tree[now<<1|1].val;tree[now].mx=1LL*tree[now<<1].num*tree[now<<1|1].mx%mod;}tree[now].num=1LL*tree[now<<1].num*tree[now<<1|1].num%mod;tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}void build(int l,int r,int now){if(l==r){tree[now].mx=1LL*x[l]*y[l]%mod;tree[now].num=x[l];tree[now].val=log(1.0*x[l]*y[l]);tree[now].sum=log(1.0*x[l]);return ;}int mid=(l+r)>>1;build(l,mid,now<<1);build(mid+1,r,now<<1|1);pushup(now);
}void updata(int L,int l,int r,int now){if(l==r){tree[now].mx=1LL*x[l]*y[l]%mod;tree[now].num=x[l];tree[now].val=log(1.0*x[l]*y[l]);tree[now].sum=log(1.0*x[l]);return ;}int mid=(l+r)>>1;if(L<=mid)updata(L,l,mid,now<<1);else updata(L,mid+1,r,now<<1|1);pushup(now);
}int init(int N, int X[], int Y[]){n=N;for(int i=1;i<=n;i++)x[i]=X[i-1],y[i]=Y[i-1];build(1,n,1);return tree[1].mx;
}int updateX(int pos, int val){x[pos+1]=val;updata(pos+1,1,n,1);return tree[1].mx;
}int updateY(int pos, int val){y[pos+1]=val;updata(pos+1,1,n,1);return tree[1].mx;
}static inline int _readInt(){int c, x, s;c = getchar();while (c <= 32) c = getchar();x = 0;s = 1;if (c == '-'){s = -1;c = getchar();}while (c > 32){x *= 10;x += c - '0';c = getchar();}if (s < 0) x = -x;return x;
}int main(){int N; N = _readInt();int *X = (int*)malloc(sizeof(int)*(unsigned int)N);int *Y = (int*)malloc(sizeof(int)*(unsigned int)N);for(int i = 0; i < N; i++){X[i] = _readInt();}for(int i = 0; i < N; i++){Y[i] = _readInt();} printf("%d\n",init(N,X,Y));int M; M = _readInt();for(int i = 0; i < M; i++){int type; type = _readInt();int pos; pos = _readInt();int val; val = _readInt(); if (type == 1){printf("%d\n",updateX(pos,val));} else if (type == 2){printf("%d\n",updateY(pos,val));}}return 0;
}
洛谷P4837 养殖呆河马(线段树)相关推荐
- 洛谷 P3373 【模板】线段树 2 题解
洛谷 P3373 [模板]线段树 2 题解 题面 题目链接:[戳这里](https://www.luogu.org/problemnew/show/P3373) 题目描述 输入输出格式 输入输出样例 ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- 洛谷 P3372 【模板】线段树 1(线段树区间加区间找)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...
- 洛谷T44252 线索_分治线段树_思维题
分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...
- 洛谷P3588 [POI2015]PUS(线段树优化建图)
题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...
- [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)
5286: [Hnoi2018]转盘 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 15 Solved: 11 [Submit][Status][ ...
- 洛谷 P3372 【模板】线段树 1
文章目录 题目描述 输入格式 输出格式 输入输出样例 说明 [样例解释] AC的C++代码(结合注释理解) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上k. 求出某区间 ...
- 洛谷 P3373 【模板】线段树 2 解题报告
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...
- 洛谷 P4188 [USACO18JAN]Lifeguards (线段树)
Problem 给 nnn 个区间,请你删去一个区间,问剩下区间并集最长为多少 Solution 线段树维护区间覆盖长度- 然后每次删去一个区间看剩下的并集长度,再加上那个这个区间- 注意: 线段树求 ...
最新文章
- # LeetCode集锦(四) - 第13题 Roman To Integer
- c语言双分支结构运算符,c语言——运算符、分支结构、循环结构
- java 字节 操作_实例解析Java byte数组操纵方式代码
- Java中调用文件中所有bat脚本
- 多线程的那点儿事(基础篇)
- LeetCode Python实现 二叉树简单部分
- 高德地图联手中国气象局,积水地图 AI 版实时预测道路积水
- 栗子——自定义EditText实现右下角计数控件
- SpringBoot数据访问-------------数据缓存
- 【Flink Forward Asia 2021】活动报告出炉,实时即未来!
- server2019安装mysql_windows server2019下安装mysql8.0.11
- 计算机windows8黑屏怎么办,win8电脑黑屏只有鼠标如何处理?开机黑屏只有鼠标处理办法...
- 2011年1月31日nod32id,nod32免费激活码_NOD32用户名密码
- matlab抛物柱面 y 2=2x,求曲面z=根号(x2+y2)被柱面z2=2x割下部分的面积
- 嵌入式--需要懂的网站
- 基于XTerm模拟发包实现
- CBOW与Skip-Gram
- aliyun短信及短信模板操作
- Latex编译报错 “Undefined control sequence. \chapter“
- Apollo第二讲—apollo自动驾驶调试及仿真实践
热门文章
- remote: A default branch (e.g. master) does not yet exist for */*
- leetcode刷题(53)——52. N皇后 II
- 活动星投票唱响泉城网络评选投票在线投票小程序如何挑选投票平台
- 湖北武汉电动机保护器公司哪家好_电动机保护器-上海硕吉电器_新浪博客
- 【前端面试题】—21道有关移动端的面试题(附答案)
- VS code win10 环境,下载安装调试
- 冯诺依曼计算机程序及其执行,冯诺依曼计算机机器级程序及其执行DOC
- 听见丨阿里“双十一”成交总额1682亿 京东双十一累计下单金额1271亿
- CSAPP-Revision-ch03(三)
- 硬件速攻-SG90舵机(180和360)