hdu_1556 Color the ball

本文通过解决一道编程题目,对比了树状数组和线段树两种数据结构的应用。详细介绍了这两种数据结构的实现代码,并总结了树状数组在解决此类问题时的简便性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556

分析: 属于更新区间,找点类型的题。

       有树状数组,线段树两种方法,不用说也知道树状数组的简单些。

       树状数组,里面存的是一段区间的染色次数。属于向前更新,向后查找。

      线段树的话,节点里存有一段区间的染色次数,更新后,DFS一次得到每点的值。

我的代码(树状数组):

#include<stdio.h>
#include<string.h>
#define MAXN 100005
int C[MAXN];
int n;
int lowbit(int i)
{
    return i&(-i);
}
void updata(int i,int m)
{
    while(i>0)
    {
        C[i]+=m;
        i-=lowbit(i);
    }
}
int get_sum(int i)
{
    int sum=0;
    while(i<=n) {
        sum+=C[i];
        i+=lowbit(i);
    }
    return sum;
}
int main()
{
    while(~scanf("%d",&n)&&n)
    {
        memset(C,0,sizeof(C));
       for(int i=0;i<n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            updata( b,1);
            updata( a-1,-1); //[a,b] 为染的次数。
        }
        for(int i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",get_sum(i));
    }
    return 0;
}

我的代码(线段树):

#include<stdio.h>
#include<string.h>
#define MAXN 100005
struct Node
{
    int l,r;
    int num;
}segtree[MAXN<<2];
void build(int i,int l,int r)
{
    segtree[i].l=l;
    segtree[i].r=r;
    segtree[i].num=0;
    if(l==r) return ;
    int mid=(l+r)>>1;
    build( i*2, l, mid);
    build( i*2+1,mid+1, r);
}
void Modfiy(int i,int x,int y)//区间[a,b]段加1;
{
    //区间段的染色次数。
    if(x==segtree[i].l&&y==segtree[i].r)
    {
        segtree[i].num+=1;
        return ;
    }
    int mid=(segtree[i].l+segtree[i].r)>>1;
    if(y<=mid)
        Modfiy(i<<1,x, y);
    else if(x>mid)
        Modfiy(i<<1|1, x, y);
    else
    {
         Modfiy(i<<1,x, mid);
         Modfiy(i<<1|1, mid+1, y);
    }
}
int ans[MAXN];
void DFS(int i)
{
    for(int j=segtree[i].l;j<=segtree[i].r;j++) ans[j]+=segtree[i].num;
    if(segtree[i].l==segtree[i].r) return ;
    DFS( i<<1);
    DFS( i<<1|1);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        build(1,1,n);
        for(int i=0;i<n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
             Modfiy(1,a,b);
        }
        memset(ans,0,sizeof(ans));
        DFS(1);
     //   printf("OK?\n");
        for(int i=1;i<=n;i++) printf(i!=n?"%d ":"%d\n",ans[i]);
    }


    return 0;
}

总结:还是树状数组的简单↖(^ω^)↗。。


今天再做这题的时候,数组直接复制了100000,果断WA了........o(>﹏<)o。——2013_9_9


内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值