结点更新+区间统计——[Usaco2007 Jan]Balanced Lineup

题目种涉及到区间的查询,想到线段树
View Code
#include<stdio.h>

int tmin=10000009,tmax=0;
struct data
{
int l,r;
int min,max;
}node[
9950009];


int fmax(int a,int b)
{
return a>b?a:b;
}
int fmin(int a,int b)
{
return a<b?a:b;
}

void build(int ll,int rr,int n)
{
node[n].l
=ll;
node[n].r
=rr;
node[n].max
=-1;
node[n].min
=1000009;
if (ll==rr) return ;
int mid=(ll+rr)/2;
build(ll,mid,
2*n);
build(mid
+1,rr,2*n+1);
}
void updata(int ll,int rr,int a,int n)
{
if (node[n].l==ll&&node[n].r==rr)
{
if(a>node[n].max)
node[n].max
=a;
if(a<node[n].min)
node[n].min
=a;
return ;
}

int mid=(node[n].l+node[n].r)/2;
if (rr<=mid) updata(ll,rr,a,2*n);
else if (ll>=mid+1) updata(ll,rr,a,2*n+1);
else
{
updata(ll,mid,a,
2*n);
updata(mid
+1,rr,a,2*n+1);
}
if(node[2*n].max>node[n].max)node[n].max=node[2*n].max;
if(node[2*n+1].max>node[n].max)node[n].max=node[2*n+1].max;
if(node[2*n].min<node[n].min)node[n].min=node[2*n].min;
if(node[2*n+1].min<node[n].min)node[n].min=node[2*n+1].min;
}

void search(int ll,int rr,int n)
{
if(node[n].l==ll&&node[n].r==rr)
{
if(tmin>node[n].min)tmin=node[n].min;
if(tmax<node[n].max)tmax=node[n].max;
return ;
}
else
{
int mid=(node[n].l+node[n].r)/2;
if (rr<=mid) search(ll,rr,2*n);
else if (ll>mid) search(ll,rr,2*n+1);
else
{
search(ll,mid,
2*n);
search(mid
+1,rr,2*n+1);
}
}

}

int main()
{
int L,Q,n;
while(scanf("%d%d",&L,&Q)!=EOF)
{
build(
1,L,1);

int i;
for(i=1;i<=L;i++)
{
int temp;
scanf(
"%d",&temp);
updata(i,i,temp,
1);
}

while(Q--)
{
int ll,rr;
scanf(
"%d%d",&ll,&rr);
tmin
=10000009,tmax=0;
search(ll,rr,
1);
printf(
"%d\n",tmax-tmin);
}
}
return 0;
}

  

原文地址:https://www.cnblogs.com/huhuuu/p/2114591.html