题目描述
blablabla
样例
blablabla
c++和java代码
算法1
线段树
blablabla
时间复杂度
参考文献
java 代码
import java.io.*;
public class Main {
static int n;
static int N=100010;
static int []arr=new int[N];
static Node[]tr=new Node[N*4];
static class Node{
int l,r;
int v;
public Node(int l,int r,int v)
{
this.l=l;
this.r=r;
this.v=v;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter wr=new BufferedWriter(new OutputStreamWriter(System.out));
String []nm=br.readLine().split(" ");
n=Integer.parseInt(nm[0]);
int m=Integer.parseInt(nm[1]);
String[] num=br.readLine().split(" ");
build(1,1,n);
//如果我们是在读取数组元素的时候初始化,那么就要先build
for(int i=1;i<=n;i++)
{
arr[i]=Integer.parseInt(num[i-1]);
modify(1,i,arr[i]);
}
while(m!=0)
{
m--;
String []tem=br.readLine().split(" ");
int l=Integer.parseInt(tem[0]);
int r=Integer.parseInt(tem[1]);
wr.write(query(1,l,r)+"\n");
}
wr.close();
}
//注意,这里不是一个一个添加,所以可以直接初始化为数组的值
static void build(int u,int l,int r)
{
tr[u]=new Node(l,r,0);
if(l==r){return;}
else
{
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
}
//找到所有被l,r覆盖的子区间
static int query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r){return tr[u].v;}
int v=0;
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)
{
v=query(u<<1,l,r);
}
if(r>mid)
{
v=Math.max(v,query(u<<1|1,l,r));
}
return v;
}
static void pushup(int u)
{
tr[u].v=Math.max(tr[u<<1].v,tr[u<<1|1].v);
}
//修改数组x位置上的c
static void modify(int u,int x,int c)
{
if(tr[u].l==x&&tr[u].r==x){tr[u].v=c;}
else
{
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid){modify(u<<1,x,c);}
else
{
modify(u<<1|1,x,c);
}
pushup(u);
}
}
}
算法2
RMQ
blablabla
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100010;
const int M=17;
int f[N][M];
int arr[N];
int n;
void init()
{
for(int j=0;j<=M;j++)
{
//右端点不能超过n
for(int i=1;i+(1<<j)-1<=n;i++)
{
if(j==0){f[i][j]=arr[i];}
else
{
//取两部分中最大的
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
}
}
int query(int l,int r)
{
int len=r-l+1;
int k=log(len)/log(2);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
int m;
cin>>m;
for(int i=1;i<=n;i++){cin>>arr[i];}
init();
while(m--)
{
int l,r;
cin>>l>>r;
cout<<query(l,r)<<endl;
}
return 0;
}