poj 3368

来源:互联网 发布:windows是什么语言 编辑:程序博客网 时间:2024/06/09 15:20

最近写的程序不是超时就是WA,而且都找不到原因,还好这道题是自己从超时里面优化出来的,尽管还是很慢啊!

题是利用离散化和线段树,别的不说了,看代码吧

#include<iostream>#include<cstdio>#include<string>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>using namespace std;#define ll __int64#define rep(i,n) for(i=0; i<(n); i++) #define reph(i,n,m) for(i=(n); i<=(m); i++)//正循环的#define repd(i,n,m) for(i=(n); i>=(m); i--) //负循环的 #define fab(a) (a)>0?(a):0-(a)#define arc(a) (a)*(a)#define inf 10000000   //最大值的#define exp 0.0000001     //浮点型的#define N   100010int a[N],b[N];int len,sum;typedef struct tree{        int sum,l,r;         } rr;tree node[N*17];void Maketree(int i,int l,int r){     node[i].l=l;     node[i].r=r;     if(l==r)     {             node[i].sum=b[len++];//记录总的数的               return ;             }     int mid=(l+r)/2;     Maketree(2*i,l,mid);     Maketree(2*i+1,mid+1,r);      node[i].sum=max(node[2*i].sum,node[2*i+1].sum); }void find(int i,int l, int r){      if(l<=node[i].l && node[i].r<=r)      {                      sum=max(sum,node[i].sum);                      return;      }      int mid=(node[i].l+node[i].r)/2;      if(r<=mid)      find(2*i,l,r);      else if(l>mid)      find(2*i+1,l,r);      else      {          find(2*i,l,r);          find(2*i+1,l,r);      } } int fen(int l,int r,int x) {     int mid;     while(l<=r)     {                mid=(l+r)/2;                if(x==b[mid])                return mid;                if(b[mid]<x)                 l=mid+1;                else                 r=mid-1;      }     return l; }int main(){    int n,m,i,j;    while(scanf("%d",&n))    {        if(n==0)          break;        scanf("%d",&m);        reph(i,1,n)         scanf("%d",&a[i]);        len=1;        b[1]=1;        reph(i,2,n)          if(a[i]==a[i-1])             b[len]++;          else             b[++len]=1;        n=len;//用n记录数组的长度的        len=1;        Maketree(1,1,n);         reph(i,2,n)        b[i]+=b[i-1];        int x,y;        while(m--)        {                  sum=0;                  scanf("%d%d",&x,&y);                  i=fen(1,n,x);                  j=fen(1,n,y);                  if(i==j)                    sum=y-x+1;                  else                  {                      sum=b[i]-x+1;                      sum=max(sum,y-b[j-1]);                      if(j>i+1)                       find(1,i+1,j-1);                  }                  printf("%d\n",sum);        }    }    return 0;}


原创粉丝点击