zoukankan      html  css  js  c++  java
  • 北京信息科技大学第十一届程序设计竞赛(重现赛)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;
    }
  • 相关阅读:
    SVN中trunk、branches、tag的使用
    svn建立分支和svn代码合并的操作方法
    SVN分支的合并和同步
    iOS开发--即时通讯
    iOS 开发--开源图片处理圆角
    ios开发--网易滚动导航栏
    ios开发--高德地图SDK使用简介
    大型网站架构演变和知识体系
    Nginx配置文件nginx.conf中文详解
    nginx+apache+php+mysql服务器集群搭建
  • 原文地址:https://www.cnblogs.com/Vampire6/p/11131753.html
Copyright © 2011-2022 走看看