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; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性