题目描述
小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题。
让他在1天的时间内给出答案。
但是小C不会这问题,现在他来请教你。
请你帮他解决这个问题。
有n个数,每个数有权值。
数学老师定义了区间价值为区间和乘上区间内的最小值。
现在要你找出有最大区间价值的区间是什么,并输出区间价值。

输入
每个输入文件只包含单组数据。
第一行一个整数n。(1 <= n <= 100000)
第二行n个整数a_1,a_2,…,a_n。(0 <= a_i <= 1000000)

输出
第一行输出一个整数,表示最大的区间价值。
第二行输出两个整数,表示区间的起点和终点。
保证答案唯一。

样例输入
6
10 1 9 4 5 9
样例输出
108
3 6

确实是比较麻烦的一道题,涉及到区间和以及线段树的不少知识。这里分别用两个数组三个函数来实现。首先两个数组分别是sum数组,用于记录前缀和,以此来节省求和的过程,另一个是num数组,用来记录每个数的权值。结构体中存放的变量分别为区间左右值,区间最小值和区间最小值对应的下标。

三个函数中,初始化函数是对线段树的初始化,网上不少办法用到了pair,这里可以不用,直接用线段树的左右节点来求最小值就可以。find函数用于找最大的区间价值,其实就是一个分治的过程,找最大值的过程中,利用区间最小值点,将整个区间分为三部分,点左侧,点,点右侧,分别求点左侧区间和X点左侧最小值,点右侧区间和X点右侧最小值,整个区间区间和X点,取这三个值中更大的那个为结果。querymin函数用来找区间的最小值所在点,网上的办法用到了pair,这里修改了一下,直接返回最小值所在的节点编号,这样直接用过结构体找最小值和下标,思路是一样的。

总的来说,利用线段树找区间的最小值,然后用前缀和找区间和,在寻找最大区间价值时用分治的思想,这就是这道题一个大体的解决思路。

AC代码

#include<iostream>
#include<stdio.h>
using namespace std;
struct Node {int l,r;int mmin;//区间内的最小值 int id;//区间内最小值对应的下标
};
struct Node nodes[100005<<2];
long long int num[100005];
long long int sum[100005];
long long int ans=0;
int st=1,ed=1;
int querymin(int l,int r,int n)
{int mid;if(l==nodes[n].l&&r==nodes[n].r)return n;mid=(nodes[n].l+nodes[n].r)>>1;if(r<=mid)return querymin(l,r,n<<1);else if(l>mid)return querymin(l,r,n<<1|1);else{int a1=querymin(l,mid,n<<1);int a2=querymin(mid+1,r,n<<1|1);return nodes[a1].mmin<nodes[a2].mmin?a1:a2;}
}
long long int find(int l,int r)
{if(l>r) return 0;if(l==r)return num[l]*num[l];int p=querymin(l,r,1);int pos=nodes[p].id;long long int m=nodes[p].mmin;long long int res=(sum[r]-sum[l-1])*m;if(res>ans){ans=res;st=l;ed=r;}return max(res,max(find(l,pos-1),find(pos+1,r)));
}void build(int l,int r,int n)
{nodes[n].l=l;nodes[n].r=r;if(l==r){nodes[n].id=l;nodes[n].mmin=num[l];return;}   int mid=(l+r)>>1;build(l,mid,n<<1);build(mid+1,r,n<<1|1);if(nodes[n<<1].mmin<nodes[n<<1|1].mmin){nodes[n].mmin=nodes[n<<1].mmin;nodes[n].id=nodes[n<<1].id;}else{nodes[n].mmin=nodes[n<<1|1].mmin;nodes[n].id=nodes[n<<1|1].id;}
}
int main()
{int n;cin>>n;sum[0]=0;for(int i=1;i<=n;i++){cin>>num[i];sum[i]=sum[i-1]+num[i];} build(1,n,1);cout<<find(1,n)<<endl;cout<<st<<" "<<ed<<endl;   return 0;
}

小C的数学问题 线段树+分治相关推荐

  1. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  2. CF311D Interval Cubing 数学、线段树

    CF311D Interval Cubing 数学.线段树 数学太重要了..有些人知道点结论就喜欢搞个数学包装水题,欺负吾等数学学渣啊... CF有官方题解,不过我还是记录一下吧. 这是个线段树的经典 ...

  3. [CTSC2016]时空旅行 (线段树分治)

    前言 昨天学习了线段树分治,算法比较抽象,没有学得太具体,今天做一道例题练练手 --自闭前 题面上洛谷 题意 维护若干个集合,每个集合都是由一个编号比它小的集合加入一个二元组(x,c)(x,c)(x, ...

  4. 时空旅行[线段树分治][维护凸壳]

    文章目录 前言 题目 思路 代码 前言 肝了一上午-这是我才学线段树分治的例题-真舒服 题目 温馨提示:首先在UOJ做,LOJ挖数据,BZOJ终极评测... UOJ198 二手剽- 思路 为什么不能用 ...

  5. 越野赛车问题——线段树分治+并查集

    题目 [题目描述] 小 $H$ 是一位优秀的越野赛车女选手.现在她准备在 $A$ 山上进行赛车训练. $A$ 山上一共有 $n$ 个广场,编号依次为 $1$ 到 $n$ ,这些广场之间通过 $n-1$ ...

  6. 【BZOJ4184】shallot(线段树分治,线性基)

    [BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...

  7. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  8. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  9. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

最新文章

  1. 关于self.用法的一些总结
  2. Java线程池框架核心代码分析
  3. android tween动画效果
  4. (23/24) webpack实战技巧:如何在webpack环境中使用Json
  5. 谷歌、微软、亚马逊6个惊人的A/B测试实例
  6. 【Elasticsearch】玩转 Elasticsearch 7.8 的 SQL 功能
  7. redis的IM的聊天工具
  8. Emgu.CV.CvInvoke的类型初始值设定项引发异常
  9. Java与模式:装饰(Decorator)模式
  10. php+app接口返回json数据,PHP对接APP的接口类,可返回json数据,xml数据
  11. mysql存储过程实现_原来MySQL的存储过程也可以这么玩?
  12. 网上订餐php论文,php032网上订餐系统
  13. 这种 Unicode 符号,让百万人中招下了假应用…
  14. SQLServer从mdf和ldb还原数据库
  15. 测试窗体的FormBorderStyle属性,不同属性所对应的窗体边框显示情况
  16. 单片机双机通信c语言,单片机双机通信(C51程序)
  17. 大数据行业就业指南:三大方向 十大职位
  18. [BZOJ1911] [Apio2010]特别行动队
  19. influx客户端基本操作
  20. 心理学与计算机应用,心理学可以和计算机结合做些什么么?

热门文章

  1. java Unicode转UTF-8代码
  2. Flash ActionScript 2.0基础教程
  3. 7年前的200电话卡帐号
  4. ADO.NET 如何读取 Excel (下)
  5. 夯实Java基础(二十)——JAVA正则表达式
  6. 通过反射创建对象和调用方法
  7. 【第九届蓝桥杯大赛决赛真题】JAVA大学C组题解
  8. phpmyadmin在nginx环境下配置错误
  9. python装饰器之函数作用域
  10. javascript第三节