北京資訊科技大學第十一屆程式設計競賽(重現賽)I

_Vampire發表於2019-07-04

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;
}

 

相關文章