[kuangbin带你飞]专题七 线段树 G POJ 3264

来源:互联网 发布:三国志9威力加强版mac 编辑:程序博客网 时间:2024/05/20 23:37

题目地址:https://vjudge.net/contest/66989#problem/G

思路:求区间最大值和最小值的差。模板题,拍个模板就过了,没发现有什么坑。

AC代码:

#include<cstring>#include<cstdio>#include<iostream>using namespace std;const int maxn=5e5+10;struct seq{    int n1,n2,l,r;//n1最大,n2最小}T[maxn*4];void build(int l,int r,int k){    T[k].l=l,T[k].r=r;    if(l==r)    {        scanf("%d",&T[k].n1);        T[k].n2=T[k].n1;        return;    }    int mid=(l+r)>>1;    build(l,mid,k<<1);    build(mid+1,r,k<<1|1);    T[k].n1=max(T[k<<1].n1,T[k<<1|1].n1);    T[k].n2=min(T[k<<1].n2,T[k<<1|1].n2);}int ans1,ans2;void search(int l,int r,int k){    if(T[k].l==l && T[k].r==r)    {        ans1=max(ans1,T[k].n1);        ans2=min(ans2,T[k].n2);        return;    }    //printf("%d\n",k);    int mid=(T[k].l+T[k].r)>>1;    if(r<=mid)        search(l,r,k<<1);    else if(l>mid)        search(l,r,k<<1|1);    else    {        search(l,mid,k<<1);        search(mid+1,r,k<<1|1);    }}int main(){    int n,q;    scanf("%d%d",&n,&q);    build(1,n,1);    while(q--)    {        int a,b;        scanf("%d%d",&a,&b);        ans1=-1,ans2=0x3f3f3f3f;        search(a,b,1);        printf("%d\n",ans1-ans2);    }}


0 0
原创粉丝点击