NC50046. andy种树
描述
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棵树C++11(clang++ 3.9) 解法, 执行用时: 66ms, 内存消耗: 1488K, 提交时间: 2020-02-26 00:06:20
#include<bits/stdc++.h> using namespace std; int main() { int n,q,a[100005]={}; cin>>n>>q; while(q--) { int x,y; cin>>x>>y; a[x]++; a[y+1]--; } for(int i=1;i<=n;i++) { a[i]+=a[i-1]; cout<<a[i]<<' '; } return 0; }
Go(1.9.1) 解法, 执行用时: 964ms, 内存消耗: 6616K, 提交时间: 2019-08-28 20:49:45
package main import "fmt" func main() { var n,q int fmt.Scan(&n,&q) s:=make([]int,n+2,n+2) for ;q>0;q--{ var l,r int fmt.Scan(&l,&r) s[l]++ s[r+1]-- } for i:=1;i<=n;i++ { s[i]+=s[i-1] fmt.Printf("%d ",s[i]) } }
C++14(g++5.4) 解法, 执行用时: 20ms, 内存消耗: 936K, 提交时间: 2020-10-13 15:19:30
#include<stdio.h> int c[100005]; int main() { int n,m,a,b,sum=0; scanf("%d %d",&n,&m); while(m--){ scanf("%d %d",&a,&b); c[a]++; c[b+1]--; } for(int i=1;i<=n;i++) { sum=sum+c[i]; printf("%d ",sum); } }
Python3(3.5.2) 解法, 执行用时: 715ms, 内存消耗: 8000K, 提交时间: 2019-06-30 21:43:45
n,q=map(int,input().split()) a=[0]*100010 b=0 for _ in range(q): x,y=map(int,input().split()) a[x]+=1 a[y+1]-=1 for i in range(n): b+=a[i+1] print(b,end=" ")