• bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队【st表||线段树】


    要求区间取min和max,可以用st表或线段树维护
    st表

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=100005;
    int n,q,b[N],mn[N][20],mx[N][20];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int maxx(int l,int r)
    {
    	int k=b[r-l+1];
    	return max(mx[l][k],mx[r-(1<<k)+1][k]);
    }
    int minn(int l,int r)
    {
    	int k=b[r-l+1];
    	return min(mn[l][k],mn[r-(1<<k)+1][k]);
    }
    int main()
    {
    	n=read(),q=read();
        for(int i=1;i<=n;i++)
    		mn[i][0]=mx[i][0]=read();
    	for(int i=2;i<=n;i++)
    		b[i]=b[i>>1]+1;
    	for(int j=1;(1<<j)<=n;j++)
    		for(int i=1;i<=n;i++)
    			mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
    	for(int j=1;(1<<j)<=n;j++)
    		for(int i=1;i<=n;i++)
    			mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
        while(q--)
        {
            int x=read(),y=read();
            printf("%d
    ",maxx(x,y)-minn(x,y));
        }
        return 0;
    } 
    

    线段树

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=100005;
    int n,q,a[N];
    struct tree
    {
        int l,r,mi,ma;
    }t[N<<1];
    int read()
    {
        int r=0,f=1;
        char p=getchar();
        while(p>'9'||p<'0')
        {
            if(p=='-')
                f=-1;
            p=getchar();
        }
        while(p>='0'&&p<='9')
        {
            r=r*10+p-48;
            p=getchar();
        }
        return r*f;
    }
    void build(int ro,int l,int r)
    {
        t[ro].l=l,t[ro].r=r;
        if(l==r)
        {
            t[ro].mi=a[l];
            t[ro].ma=a[l];
        }
        else
        {
            int mid=(l+r)>>1;
            build(ro<<1,l,mid);
            build(ro<<1|1,mid+1,r);
            t[ro].ma=max(t[ro<<1].ma,t[ro<<1|1].ma);
            t[ro].mi=min(t[ro<<1].mi,t[ro<<1|1].mi);
        }
    }
    int maxx(int ro,int l,int r)
    {
        if(t[ro].l==l&&t[ro].r==r)
            return t[ro].ma;
        int mid=(t[ro].l+t[ro].r)>>1;
        if(r<=mid)
            return maxx(ro<<1,l,r);
        else if(l>mid)
            return maxx(ro<<1|1,l,r);
        else
            return max(maxx(ro<<1,l,mid),maxx(ro<<1|1,mid+1,r));
    }
    int minn(int ro,int l,int r)
    {
        if(t[ro].l==l&&t[ro].r==r)
            return t[ro].mi;
        int mid=(t[ro].l+t[ro].r)>>1;
        if(r<=mid)
            return minn(ro<<1,l,r);
        else if(l>mid)
            return minn(ro<<1|1,l,r);
        else
            return min(minn(ro<<1,l,mid),minn(ro<<1|1,mid+1,r));
    }
    int main()
    {
        n=read(),q=read();
        for(int i=1;i<=n;i++)
            a[i]=read();
        build(1,1,n);
        while(q--)
        {
            int x=read(),y=read();
            printf("%d
    ",maxx(1,x,y)-minn(1,x,y));
        }
        return 0;
    } 
    
  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/lokiii/p/8939331.html
Copyright © 2020-2023  润新知