hdu1556 Color the ball 简单线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
简单的线段树的应用
直接贴代码了:
代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #define maxn 100100 6 using namespace std; 7 class node 8 { 9 public: 10 int l; 11 int r; 12 int add; 13 }; 14 int n; 15 node segTree[maxn*3]; 16 int ans[maxn]; 17 void Build(int num ,int l,int r) 18 { 19 segTree[num].l=l;segTree[num].r=r; 20 segTree[num].add=0; 21 if(l==r) return ; 22 int mid=(l+r)/2; 23 Build(num*2,l,mid); 24 Build(num*2+1,mid+1,r); 25 } 26 void Update(int num,int l,int r) 27 { 28 if(segTree[num].l ==l && segTree[num].r==r) 29 { 30 segTree[num].add+=1; 31 return ; 32 } 33 int mid=(segTree[num].l + segTree[num].r)/2; 34 if(segTree[num].add) 35 { 36 segTree[num*2].add+=segTree[num].add; 37 segTree[num*2+1].add+=segTree[num].add; 38 segTree[num].add=0; 39 } 40 if(r<=mid ) Update(num*2,l,r); 41 else if(l>mid) Update(num*2+1,l,r); 42 else 43 { 44 Update(num*2,l,mid); 45 Update(num*2+1,mid+1,r); 46 } 47 } 48 void Answer(int num) 49 { 50 if(segTree[num].l == segTree[num].r) 51 {ans[segTree[num].l]=segTree[num].add; return ;} 52 if(segTree[num].add) 53 { 54 segTree[num*2].add+=segTree[num].add; 55 segTree[num*2+1].add+=segTree[num].add; 56 segTree[num].add=0; 57 } 58 59 Answer(num*2); 60 Answer(num*2+1); 61 } 62 int main() 63 { 64 while(scanf("%d",&n)!=EOF && n) 65 { 66 memset(ans,0,sizeof(ans)); 67 68 Build(1,1,n); 69 int l,r; 70 for(int i=1;i<=n;i++) 71 { 72 scanf("%d%d",&l,&r); 73 Update(1,l,r); 74 } 75 Answer(1); 76 cout<<ans[1]; 77 for(int i=2;i<=n;i++) 78 cout<<" "<<ans[i]; 79 cout<<endl; 80 } 81 return 0; 82 }