线段树三:求任意区间的最值

来源:互联网 发布:淘宝小玄子家是正品吗 编辑:程序博客网 时间:2024/05/23 23:38

从做这几个题目我发现了,能调用库函数的尽量调用库函数,不然的话可能会超时。不信可以试,在题1的头文件下定义宏:

#define min(a,b) (a)<(b)?(a):(b)

在题2中定义宏:

#define max(a,b) (a)>(b)?(a):(b)

题1:Tyvj 1038(忠诚),给定区间求最小值。只需更改Query即可,由于没有修改操作,可以删除Update操作。

#include<iostream>#include<cstring>#include<cstdio> #include<cmath> using namespace std;const int MAX=100010;const int Inf=100000000;//#define min(a,b) (a)<(b)?(a):(b) 不要加这个,加后会超时 #define Lson L,mid,root<<1#define Rson mid+1,R,root<<1|1int n,m,Min[MAX<<2];int Pushup(int root) {   Min[root]=min(Min[root<<1],Min[root<<1|1]);}void Build(int L,int R,int root){   if(L==R)     {   scanf("%d",&Min[root]);        return ;    }    int mid=(L+R)>>1;    Build(Lson);     Build(Rson);     Pushup(root); }int Query(int ql,int qr,int L,int R,int root) {   if(ql<=L && R<=qr) return Min[root];    int mid=(L+R)>>1;    int res=Inf;    if(ql<=mid) res=min(res,Query(ql,qr,Lson));    if(qr>mid) res=min(res,Query(ql,qr,Rson));    return res;}int main(){   int a,b;    scanf("%d%d",&n,&m);    Build(1,n,1);    for(int i=0;i<m;i++)       {   scanf("%d%d",&a,&b);        printf("%d\n",Query(a,b,1,n,1));    }     return 0;}

例题2:HDU 1754(I hate it),给定区间求最大值,记得update中只是更新该结点的值。

#include<iostream>#include<cstring>#include<cstdio> #include<cmath> using namespace std;const int MAX=200010;//#define max(a,b) (a)>(b)?(a):(b) 不要加这个,加后会超时 #define Lson L,mid,root<<1#define Rson mid+1,R,root<<1|1int n,m,Max[MAX<<2];int Pushup(int root) {   Max[root]=max(Max[root<<1],Max[root<<1|1]);}void Build(int L,int R,int root){   if(L==R)     {   scanf("%d",&Max[root]);        return ;    }    int mid=(L+R)>>1;    Build(Lson);     Build(Rson);     Pushup(root); }void Update(int q,int val,int L,int R,int root){   if(L==R)    {   Max[root]=val;        return ;    }     int mid=(L+R)>>1;    if(q<=mid) Update(q,val,Lson);    else Update(q,val,Rson);     Pushup(root);}int Query(int ql,int qr,int L,int R,int root) {   if(ql<=L && R<=qr) return Max[root];    int mid=(L+R)>>1;    int res=0;    if(ql<=mid) res=max(res,Query(ql,qr,Lson));    if(qr>mid) res=max(res,Query(ql,qr,Rson));    return res;}int main(){   int a,b;    while(~scanf("%d%d",&n,&m))    {   Build(1,n,1);           char op[5];        getchar();        while(m--)        {   scanf("%s%d%d",op,&a,&b);            if(op[0]=='U') Update(a,b,1,n,1);            if(op[0]=='Q') printf("%d\n",Query(a,b,1,n,1));        }    }     return 0;}


 

原创粉丝点击