POJ2777 线段树(结构体指针)

来源:互联网 发布:男友一夜 知乎 编辑:程序博客网 时间:2024/06/10 01:15

    #include<stdio.h>      #include<stdlib.h>      struct node{          int c,s,t;          struct node *l,*r;          node(){              c=1;              l=NULL;r=NULL;          }      };          int a[31];      void create_tree(struct node *x){          int mid;          struct node *p,*q;          mid=(x->s+x->t)/2;          if(x->t-x->s>1){              p=new node;              p->s=x->s;              p->t=mid;              q=new node;              q->s=mid;              q->t=x->t;              x->l=p;x->r=q;              create_tree(p);              create_tree(q);          }      }      void draw(struct node *k,int x,int y,int z){          int mid=(k->s+k->t)/2;                  if(k->s==x && k->t==y){              k->c=z;              return;          }else if(y<=mid){              if(k->c!=-1){                  k->l->c=k->c;                  k->r->c=k->c;              }              k->c=-1;draw(k->l,x,y,z);          }else if(x>=mid){              if(k->c!=-1){                  k->l->c=k->c;                  k->r->c=k->c;              }                 k->c=-1;              draw(k->r,x,y,z);          }else{              if(k->c!=-1){                  k->l->c=k->c;                  k->r->c=k->c;              }                 k->c=-1;              draw(k->l,x,mid,z);              draw(k->r,mid,y,z);          }         }      void cal_tree(struct node *k,int x,int y){          int mid=(k->s+k->t)/2;          if(k->c!=-1){                         a[k->c]=1;             return;                     }else if(y<=mid){              cal_tree(k->l,x,y);          }else if(x>=mid){              cal_tree(k->r,x,y);          }else{              cal_tree(k->l,x,mid);              cal_tree(k->r,mid,y);          }         }      void dfs(struct node *k){printf("%d %d %d\n",k->s,k->t,k->c);if(k->l!=NULL)dfs(k->l);if(k->r!=NULL)dfs(k->r);}    int main(){        struct node *h;         int i,j,k,m,n,ans;          char paint,tmp;          int x,y,z;          scanf("%d%d%d",&m,&k,&n);                  h=new node;          h->s=0;h->t=m;          create_tree(h);         for(i=1;i<=n;i++){          tmp=getchar();              scanf("%c",&paint);                          if(paint=='C'){                  scanf("%d%d%d",&x,&y,&z);                 if(x<y){                      x--;                      draw(h,x,y,z);                  }else{                      y--;                      draw(h,y,x,z);                  }              }else{                  scanf("%d%d",&x,&y);                  for(j=1;j<=k;j++)a[j]=0;                  ans=0;                  if(x<y){                      x--;                     cal_tree(h,x,y);                  }else{                      y--;                      cal_tree(h,y,x);                  }                  for(j=1;j<=k;j++)ans+=a[j];                  printf("%d\n",ans);                       }         }             return 0;      }  


3 0