zoukankan      html  css  js  c++  java
  • 喵哈哈村的种花魔法(线段树(区间更新,单点查询),前缀和(单点更新,区间查询))

    http://qscoj.cn/problem/16/

    描述

    喵哈哈村有一个谷歌廖,谷歌廖特别喜欢种花。

    而且谷歌廖最神奇的就是,他会施展一种种花魔法,会使得一定区间的花儿,长高k 厘米。

    在谷歌廖施展若干次魔法之后,好奇的沈宝宝想知道,每朵花儿的高度是多少。

    第一行两个整数n,m,分别表示花儿的数量,和谷歌廖施展种花魔法的次数。
    第二行n个整数a[i],表示花儿一开始的高度为a[i]厘米。
    接下来m行,每行三个整数l,r,k。表示谷歌廖使得区间[l,r]的花儿长高了k厘米。

    1<=n,m<=100000
    1<=a[i],k<=100000
    1<=l<=r<=100000

    输出n个整数,即输出每朵花儿在施展魔法之后的高度。

                       
    3 1
    1 2 3
    1 2 5
    6 7 3
    3 2
    1 2 3
    1 3 2
    1 2 5
    8 9 5
    (1),因为题目要求最后只查询一次,所以前缀和比较方便。(单点更新,区间查询)
    #include<iostream>
    #include<cstring>
    using namespace std;
    long long a[100010],b[100010];
    int main()
    {
        long long n,m,k,l,r,i;
        cin>>n>>m;
        memset(b,0,sizeof(b));
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=m;i++)
        {
            cin>>l>>r>>k;
            b[l]+=k;
            b[r+1]-=k;
        }
        long long sum=0;
        for(i=1;i<=n;i++)
        {
            sum+=b[i];
            a[i]+=sum;
        }
        for(i=1;i<=n;i++){
            cout<<a[i]<<' ';
        }
            cout<<endl;
        return 0;
    }

    (2)再来一个线段树(区间更新,单点查询)

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int mod=4e5+9;
    long long int node[mod];//注意数据大小,小心爆了,本渣渣就爆了好久
    void build(int l,int r,int root,int n)
    {
        int mid;
        if(l==r)
        {
            scanf("%lld",&node[root]);
            return;
        }
        mid=(l+r)>>1;
        build(l,mid,root<<1,n);
        build(mid+1,r,root<<1|1,n);
    }
    void update(int L,int R,long long int add,int l,int r,int root)
    {
        if(L<=l && R>=r)
        {
            node[root]+=add;
            return ;
        }
        int mid=(l+r)>>1;
        if(L<=mid) update(L,R,add,l,mid,root<<1);
        if(mid<R) update(L,R,add,mid+1,r,root<<1|1);
    }
    void query(int l,int r,int root,long long int k)
    {
        if(l==r)
        {
            if(l==1)printf("%lld",node[root]+k) ;
            else printf(" %lld",node[root]+k) ;
            return ;
        }
        int mid=(l+r)>>1;
        query(l,mid,root<<1,k+node[root]);
        query(mid+1,r,root<<1|1,k+node[root]);
    }
    int main()
    {
        int n,m,a,b;
        long long c;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(node,0,sizeof(node));
            build(1,n,1,n);
            while(m--)
            {
                scanf("%d%d%lld",&a,&b,&c);
                update(a,b,c,1,n,1);
            }
            query(1,n,1,0);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    windows 2008 r2 开启互访和网络发现
    uchome 模拟发布动态和通知遇到的问题
    远程无法连接win2003的mssql2000服务器
    cidaemon.exe进程占用CPU资源的解决办法
    asp.net如何生成图片验证码
    SQL Server中截取日期型字段的日期部分和时间部分
    刷新项目失败。无法从服务器中检索文件夹信息。
    CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\***.dll”错误处理
    Computer Browser服务启动后自动停止
    FCK使用 体会
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/6531431.html
Copyright © 2011-2022 走看看