1 条题解

  • 0
    @ 2026-10-19 0:36:29

    [CSP-J 2022 山东] 植树节

    知识点

    差分、前缀和、区间加法

    解题思路

    对每个闭区间[a,b],令diff[a]加1、diff[b+1]减1。按坐标做前缀和,它就是每棵树的浇水次数,取最大值。

    正确性说明

    某区间在a开始贡献1,到b之后的b+1取消贡献,所以前缀和在且仅在闭区间内包含该区间的1次浇水。叠加全部区间后取最大即为答案。

    易错点

    坐标从0开始;b=1000000时仍需能写入b+1;不能将闭区间写成半开区间。

    复杂度

    时间O(n+U),空间O(U),U=1000001。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;vector<int>d(1000002);for(int i=0,a,b;i<n;i++){cin>>a>>b;++d[a];--d[b+1];}int cur=0,ans=0;for(int i=0;i<=1000000;i++)cur+=d[i],ans=max(ans,cur);cout<<ans<<'\n';}
    
    • 1

    信息

    ID
    864
    时间
    1000ms
    内存
    512MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者