• 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 }
  • 相关阅读:
    利用itextsharp.dll 导出pdf格式文件
    Oracle 连接失去联系、链接空闲例程
    Log4net用法
    oracle 用户锁定(ORA28000:the account is locked)的解锁方法:
    智能提示框设计 仿携程
    利用System.Net.Mail 的SmtpClient发送邮件
    CTE实现嵌套递归
    读入excel中的数据到数据库中
    项目发布遇见的问题的整理
    JavaScript substring() 方法
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu1556.html
Copyright © 2020-2023  润新知