植树节
思路
题目在说什么?有 个志愿者,每人负责给编号
的树苗各浇一次水,问被浇水次数最多的树苗被浇了多少次。
这是经典的差分数组问题。对区间 全部加 1,等价于在差分数组上
++ 和
--。所有操作做完后,对差分数组求前缀和就能还原每个位置的实际值,取最大值即可。
复杂度
- 时间:
,其中
是坐标上界(
)
- 空间:
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d", &n);
const int MAXN = 1000002;
vector<int> diff(MAXN + 1, 0);
for(int i = 0; i < n; i++){
int l, r;
scanf("%d %d", &l, &r);
diff[l]++;
if(r + 1 <= MAXN) diff[r + 1]--;
}
int ans = 0, cur = 0;
for(int i = 0; i <= MAXN; i++){
cur += diff[i];
ans = max(ans, cur);
}
printf("%d\n", ans);
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int MAXN = 1000002;
int[] diff = new int[MAXN + 1];
for (int i = 0; i < n; i++) {
int l = sc.nextInt();
int r = sc.nextInt();
diff[l]++;
if (r + 1 <= MAXN) diff[r + 1]--;
}
int ans = 0, cur = 0;
for (int i = 0; i <= MAXN; i++) {
cur += diff[i];
ans = Math.max(ans, cur);
}
System.out.println(ans);
}
}
import sys
input = sys.stdin.readline
def main():
n = int(input())
MAXN = 1000002
diff = [0] * (MAXN + 2)
for _ in range(n):
l, r = map(int, input().split())
diff[l] += 1
if r + 1 <= MAXN:
diff[r + 1] -= 1
ans = 0
cur = 0
for i in range(MAXN + 1):
cur += diff[i]
if cur > ans:
ans = cur
print(ans)
main()
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const n = parseInt(lines[0]);
const MAXN = 1000002;
const diff = new Int32Array(MAXN + 2);
for (let i = 1; i <= n; i++) {
const [l, r] = lines[i].split(' ').map(Number);
diff[l]++;
if (r + 1 <= MAXN) diff[r + 1]--;
}
let ans = 0, cur = 0;
for (let i = 0; i <= MAXN; i++) {
cur += diff[i];
if (cur > ans) ans = cur;
}
console.log(ans);
});



京公网安备 11010502036488号