线段树中的TLE,RE杂碎问题

来源:互联网 发布:淘宝产品后期视频 编辑:程序博客网 时间:2024/06/04 18:12

可引起RE(ACCESS_VIOLATION)的建树操作

{    int k=1;    L[1]=1;R[1]=maxn;    for(int i=1;i<=maxn;i++)    if (L[i]<R[i])    {        k++;L[k]=L[i];R[k]=(L[i]+R[i])/2;        k++;L[k]=(L[i]+R[i])/2+1;R[k]=R[i];    }}

修正

void build(int l,int r,int k){    L[k]=l;R[k]=r;mid[k]=(l+r)>>1;    v[k]=1;    if (l<r)    {        build(l,mid[k],k<<1);        build(mid[k]+1,r,(k<<1)|1);    }}

冗杂的修改操作,一念之差,

void modify(int k,int x,int y,int num){    if (x>L[k]||y<R[k]) v[k]=(v[k]==num)?num:0;    else if (x==L[k]&&y==R[k]) v[k]=num;    if (L[k]==R[k]) return;    if (x<=mid[k]) modify(k<<1,x,min(mid[k],y),num);    if (y>mid[k]) modify((k<<1)|1,max(x,mid[k]+1),y,num);    //v[k]=v[k<<1]+v[(k<<1)|1];}

void modify(int k,int x,int y,int num){    if (v[k]==num) return;    if (x==L[k]&&y==R[k])    {        v[k]=num;return;    };    if (v[k]) v[k<<1]=v[(k<<1)|1]=v[k];    v[k]=0;    if (x<=mid[k]) modify(k<<1,x,min(mid[k],y),num);    if (y>mid[k]) modify((k<<1)|1,max(x,mid[k]+1),y,num);    //v[k]=v[k<<1]+v[(k<<1)|1];}


0 0
原创粉丝点击