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棵樹的高度
思路:
差分思想,建立兩個陣列,一個陣列進行相關操作:在區間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; }