zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    HDU 2586 How far away?
    UVAlive 5796 Hedge Mazes
    HDU 4975 A simple Gaussian elimination problem.
    Poj 1149 PIGS
    HDU 3416 Marriage Match IV
    HDU 4912 Paths on the tree
    HDU 3277 Marriage Match III
    終於記起了帳號密碼
    codeforces194a
    codeforces195c
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu1556.html
Copyright © 2011-2022 走看看