POJ 2777指针

#include <cstdio>
#include <cstring>
#include <cstdlib>
struct node{    
       int c,s,t;    
       struct node *l,*r;    
       node(){    
           c=1;    
           l=NULL;r=NULL;    
       }    
   };
int a[50];

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 color(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;
        color(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;    
           color(k->r,x,y,z);    
       }else{
           if(k->c!=-1){    
               k->l->c=k->c;    
               k->r->c=k->c;    
           }       
           k->c=-1;    
           color(k->l,x,mid,z);    
           color(k->r,mid,y,z);    
       }       
   }    


void cal_tree(struct node *k,int x,int y){
	int mid;
	mid=(k->t+k->s)/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);
	}
}

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--;    
                color(h,x,y,z);    
            }else{    
                y--;    
                color(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;    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值