~~我不會ST表~~ 智推推到這個題 發現標簽中居然有線段樹。。? 於是貿然來了一發線段樹 眾所周知,線段樹的查詢是log(n)的 題目中" 請註意最大數據時限只有0.8s,數據強度不低,請務必保證你的每次查詢複雜度為 O(1) " 然後草草打完代碼竟然AC了。。exm?? 最慢也不過400ms ~ ...
我不會ST表
智推推到這個題
發現標簽中居然有線段樹。。?
於是貿然來了一發線段樹
眾所周知,線段樹的查詢是log(n)的
題目中"請註意最大數據時限只有0.8s,數據強度不低,請務必保證你的每次查詢複雜度為 O(1)"
然後草草打完代碼竟然AC了。。exm??
最慢也不過400ms
數據好水
好吧,不多說上代碼
首先是數據存貯,分別是左子節點,右子節點,maxx存貯當前節點的最大值
struct node{
int left,right,maxx;
}tree[100000*4+10];
建樹,和常規一樣
void build(int index,int l,int r)
{
tree[index].left=l,tree[index].right=r;
if(l==r)
{
int x=read();
tree[index].maxx=x;
return ;
}
int mid=(l+r)>>1;
build(index<<1,l,mid),build(index<<1|1,mid+1,r);
tree[index].maxx=max(tree[index<<1].maxx,tree[index<<1|1].maxx);
}
區間查詢,記錄每個和目標區間有交集的區間的最大值
int intervalask(int index,int l,int r)
{
if(tree[index].left>=l&&tree[index].right<=r)
return tree[index].maxx;
int tempmax=-0x7fffffff;
if(tree[index<<1].right>=l)
tempmax=max(intervalask(index<<1,l,r),tempmax);
if(tree[index<<1|1].left<=r)
tempmax=max(intervalask(index<<1|1,l,r),tempmax);
return tempmax;
}
AC代碼
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
struct node{
int left,right,maxx;
}tree[100000*4+10];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
void build(int index,int l,int r)
{
tree[index].left=l,tree[index].right=r;
if(l==r)
{
int x=read();
tree[index].maxx=x;
return ;
}
int mid=(l+r)>>1;
build(index<<1,l,mid),build(index<<1|1,mid+1,r);
tree[index].maxx=max(tree[index<<1].maxx,tree[index<<1|1].maxx);
}
int intervalask(int index,int l,int r)
{
if(tree[index].left>=l&&tree[index].right<=r)
return tree[index].maxx;
int tempmax=-0x7fffffff;
if(tree[index<<1].right>=l)
tempmax=max(intervalask(index<<1,l,r),tempmax);
if(tree[index<<1|1].left<=r)
tempmax=max(intervalask(index<<1|1,l,r),tempmax);
return tempmax;
}
int main()
{
n=read(),m=read();
build(1,1,n);
for(register int i=1,l,r;i<=m;i++)
{
l=read(),r=read();
printf("%d\n",intervalask(1,l,r));
}
}
就這麼多,學學半,如果有不理解的地方可以私信