列表

详情


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棵树

第一次使用魔法使得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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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=" ")

上一题