您的位置:首页 > 编程语言 > C语言/C++

POJ 2777指针

2016-01-31 17:25 656 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj C++