bzoj1636

来源:互联网 发布:手机怎么修改mac地址 编辑:程序博客网 时间:2024/05/29 02:32

去吧线段树!
然而被卡了。。加了读入输出优化也过不了。。后来发现线段树传递的参数少一些的话速度会飞起来~~,以后注意一下,能用空间存储尽量不要传参。。

#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,q;const int N=5e5+5;struct node{    int l,r,mx,mn;}t[200005];int a[N];int read()  {      int ret=0,flag=1;      char ch=getchar();      while (ch<'0'||ch>'9')      {          if (ch=='-') flag='-';          ch=getchar();      }      while (ch>='0'&&ch<='9')      {          ret=ret*10+ch-'0';          ch=getchar();      }      return ret*flag;  }  inline void out(int x){    int a[25],wei=0;    if(x<0)putchar('-'),x=-x;    for(;x;x/=10)a[++wei]=x%10;    if(wei==0){puts("0");return;}    for(int j=wei;j>=1;--j)putchar('0'+a[j]);    putchar('\n');}inline void build(int x,int l,int r){    t[x].l=l,t[x].r=r;    if (l==r)    {        t[x].mn=t[x].mx=a[l];        return;    }    int mid=(l+r)>>1;    build(x*2,l,mid);    build(x*2+1,mid+1,r);    t[x].mx=max(t[x*2].mx,t[x*2+1].mx);    t[x].mn=min(t[x*2].mn,t[x*2+1].mn);}inline int find1(int x,int l1,int r1){    if (t[x].l==l1&&r1==t[x].r)return t[x].mx;    int mid=(t[x].l+t[x].r)>>1;    if (r1<=mid)return find1(x*2,l1,r1);    else if (l1>mid)return find1(x*2+1,l1,r1);    else    {        return max(find1(x*2,l1,mid),find1(x*2+1,mid+1,r1));    }}inline int find2(int x,int l1,int r1){    if (t[x].l==l1&&r1==t[x].r)return t[x].mn;    int mid=(t[x].l+t[x].r)>>1;    if (r1<=mid)return find2(x*2,l1,r1);    else if (l1>mid)return find2(x*2+1,l1,r1);    else    {        return min(find2(x*2,l1,mid),find2(x*2+1,mid+1,r1));    }}int main(){    n=read(),q=read();    fo(i,1,n)    a[i]=read();    build(1,1,n);    fo(i,1,q)    {        int x,y;        x=read(),y=read();        out(find1(1,x,y)-find2(1,x,y));    }    return 0;}
0 0
原创粉丝点击