• 北京信息科技大学第十一届程序设计竞赛(重现赛)I


    I andy种树

    题目链接:https://ac.nowcoder.com/acm/contest/940/I

    题目描述

    andy在他的庄园里种了n棵树,排列成一排,标号为1到n。最开始的时候n棵树的高度都是0,也就是种子刚刚被埋下,树还没有长出来。

    andy会一种魔法,他每使用一次魔法,就可以让树标号落在连续区间[l, r]里的树的高度增加1。他可以使用q次这种魔法,然后他很好奇,在使用了q次魔法之后,他的所有树的高度分别是多少呢?

    输入描述:

    第一行输入两个整数n,q。(1<= n, q <= 1e5)

    接下来q行,每行输入两个整数l, r(l <= r),表示andy让标号落在区间[l, r]里的数高度都加1

    输出描述:

    输出有一行n个整数,每个整数后面有空格。输出末尾没有换行

    第i个数表示第i棵树的高度
    示例1

    输入

    复制
    10 3
    1 3
    2 4
    3 3

    输出

    复制
    1 2 3 1 0 0 0 0 0 0

    说明

    andy种了10棵树

    第一次使用魔法使得1、2、3棵树的高度增加1,

    所有树的高度为

    1 1 1 0 0 0 0 0 0 0

    第二次使用魔法使得2、3、4棵树的高度增加1,

    所有树的高度为

    1 2 2 1 0 0 0 0 0 0

    第三次使用魔法使得第3棵树的高度增加1

    所有树的高度为

    1 2 3 1 0 0 0 0 0 0

    思路:

    差分思想,建立两个数组,一个数组进行相关操作:在区间l,r中,l位置上加1,r+1位置上-1;另一个记录前缀和,前缀和数组即为所求数组

    #include<bits/stdc++.h>
    typedef long long ll;
    using namespace std;
    const int maxn=2e5+7;
    int main()
    {
        int n,q;
        cin>>n>>q;
        int l,r;
        int a[maxn]={0},b[maxn]={0};
        while(q--)
        {
            cin>>l>>r;
            a[l]++;
            a[r+1]--;
        }
    //    cout<<"a"<<endl;
    //    for(int i=1;i<=n;i++)
    //        cout<<a[i]<<" ";
        b[1]=a[1];
        for(int i=2;i<=n;i++)
            b[i]=a[i]+b[i-1];
       // cout<<"b"<<endl;
        for(int i=1;i<=n;i++)
            cout<<b[i]<<" ";
        return 0;
    }
  • 相关阅读:
    STL——pair
    STL——stack
    Python学习之编程基础
    开学第一课,课课有总结
    DNS域名解析
    FTP文件传输服务
    DHCP原理及配置
    Linux中配置网卡
    indoe与block解析
    Linux系统安全管理
  • 原文地址:https://www.cnblogs.com/Vampire6/p/11131753.html
Copyright © 2020-2023  润新知