这道题用到了线段树,之前看了相关的视频,对算法思路基本理解,但代码实现还有些困难,后来问了学长,自己又研究了一波,最后终于搞明白了。
线段树视频地址:https://www.bilibili.com/video/av44354587
线段树如图所示:
完整代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int tree[800010],a[200010],n,m,x;//用数组tree[]表示线段树,tree[p]是编号为p的结点所示区间中的最大值
void build(int p,int l,int r)//p是结点的编号,l和r为结点的左右边界
{
if(l==r)
{
tree[p]=a[l];
return;
}
int mid=(l+r)/2;