51Nod—1174 区间中最大的数 线段树模版

在大佬们题解的帮助下算是看懂了线段树吧。。。在这mark下防一手转头就忘。

#include<iostream>
#include<stdio.h>
using namespace std;
struct ki
{
int m,l,r;
}tree[];
int ans=-,a[];
void build(int n,int l,int r)
{
tree[n].l=l;
tree[n].r=r;
if(l==r)
{
tree[n].m=a[l];return;
}
else
{
build(n*,l,(l+r)/);
build(n*+,(l+r)/+,r);
tree[n].m=tree[n*].m>tree[n*+].m?tree[n*].m:tree[n*+].m;
}
}
void find(int n,int a,int b)
{
if(a<=tree[n].l&&b>=tree[n].r) ans=tree[n].m>ans?tree[n].m:ans;//注意a,b,r,l的关系!!!
else if(a>tree[n].r||b<tree[n].l) return;
else
{
find(n*,a,b);
find(n*+,a,b);
}
}
int main()
{
int n,m,i,j,r,l;
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&a[i]);
build(,,n);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&l,&r);
ans=-;
l++;r++;
find(,l,r);
printf("%d\n",ans);
}
}

哼叽~

上一篇:免费录屏软件之OBS Studio


下一篇:【转】VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)