POJ 2777
2014-04-30 18:36
316 查看
思路:线段树,每个节点记录是否当前区间只被一种颜色覆盖,如果是就将此颜色记录下来,如果不是,说明不是单色区间,那么就继续寻找其子区间,直到找到单色区间为止。其实很简单,因为整个区间必定是由一个个单色区间组成的!!!一开始这题提交的时候超时了,很费解,后来我把全局变量mid改成局部变量居然过了,不知道为什么,难道CPU对这两者的访问效率不同?反正很费解。。。,以后注意吧,少用全局变量。
#include<stdio.h> #include<string.h> #define L(x) (x << 1) #define R(x) (x << 1|1) #define MAX 100000 #define T 40 typedef struct { int l,r; int cover; }Node; Node node[3*MAX]; int color[T]; int sum; void build(int l,int r,int k) { node[k].l = l; node[k].r = r; if(l == r) return ; int mid = (l+r) >> 1; build(l,mid,L(k)); build(mid+1,r,R(k)); } void insert(int l,int r,int clr,int k) { if(l <= node[k].l && r >= node[k].r) { node[k].cover = clr; return ; } else { if(node[k].cover > 0) { node[L(k)].cover = node[k].cover; node[R(k)].cover = node[k].cover; node[k].cover = 0; } if(l > node[L(k)].r) insert(l,r,clr,R(k)); else if(r <= node[L(k)].r) insert(l,r,clr,L(k)); else { insert(l,node[L(k)].r,clr,L(k)); insert(node[R(k)].l,r,clr,R(k)); } } } void get_result(int l,int r,int k) { if(node[k].cover > 0) { color[node[k].cover] = 1; } else { if(l > node[L(k)].r) get_result(l,r,R(k)); else if(r <= node[L(k)].r ) get_result(l,r,L(k)); else { get_result(l,node[L(k)].r,L(k)); get_result(node[R(k)].l,r,R(k)); } } } int main() { int n,t,m,i,j; int a,b,c,d,e; char str[5]; //freopen("in.c","r",stdin); while(~scanf("%d%d%d",&n,&t,&m)) { memset(str,0,sizeof(str)); memset(color,0,sizeof(color)); build(1,n,1); node[1].cover = 1; for(i = 1;i <= m;i ++) { scanf("%s",str); if(!strcmp(str,"C")) { scanf("%d%d%d",&a,&b,&c); d = a < b?a:b; e = a > b?a:b; insert(d,e,c,1); } if(!strcmp(str,"P")) { sum = 0; scanf("%d%d",&a,&b); memset(color,0,sizeof(color)); d = a < b?a:b; e = a > b?a:b; get_result(d,e,1); for(j = 1;j <= t;j ++) { if(color[j]) sum ++; } printf("%d\n",sum); } memset(str,0,sizeof(str)); } } return 0; }