(2012-07-27 23:37:34)
SOJ2436:http://cstest.scu.edu.cn/soj/problem.action?id=2436
这道题是POJ3264的删减版。其实线段树形式有多样,最关键的是要弄清楚每个结点要存的信息。
代码:
#include<iostream>
using namespace std;
struct node
{
int L;
int R;
node *left;
node *right;
int minnum;
node(int a,int b)
{
L=a;
R=b;
minnum=1000000001;
left=NULL;
right=NULL;
}
};
int s[30005];
void con_tree(node *root)//建立线段树。
{
int i;
if(root->L==root->R)
return ;
int mid=(root->L+root->R)/2;
node *temp1=new node(root->L,mid);
for(i=root->L;i<=mid;i++)
if(s[i]<temp1->minnum)
temp1->minnum=s[i];
root->left=temp1;
con_tree(temp1);
node *temp2=new node(mid+1,root->R);
for(i=mid+1;i<=root->R;i++)
if(s[i]<temp2->minnum)
temp2->minnum=s[i];
root->right=temp2;
con_tree(temp2);
}
int xiaoye;
void search_min(node *root,int a,int b)
{
int mid=(root->L+root->R)/2;
if(a==root->L && b==root->R)
{
if(root->minnum<xiaoye)
xiaoye=root->minnum;
return ;
}
else if(b<=mid)
{
search_min(root->left,a,b);
}
else if(a>mid)
{
search_min(root->right,a,b);
}
else
{
search_min(root->left,a,mid);
search_min(root->right,mid+1,b);
}
}
int main()
{
int test;
scanf("%d",&test);
int n,m;
int a,b;
int i;
while(test--)
{
scanf("%d",&n);
node *root=new node(1,n);//
for(i=1;i<=n;i++)
{
scanf("%d",&s[i]);
if(s[i]<root->minnum)
root->minnum=s[i];
}
con_tree(root);//
scanf("%d",&m);
for(i=0;i<m;i++)
{
xiaoye=1000000001;
scanf("%d%d",&a,&b);
search_min(root,a,b);
printf("%d\n",xiaoye);
}
}
return 0;
}