1 条题解

  • 0
    @ 2025-4-16 16:33:35

    若仅考虑区间 [l,n][l,n] ,我们可以用差分记录,然后二次前缀和即可获得答案。

    若有一段区间 [li,ri][l_i,r_i] ,经过观察我们可以发现 [ri+1,n][r_i+1,n] 这一段每个位置的答案都多出 rili+1r_i-l_i+1 。我们考虑在第二次前缀和遍历到下标 ri+1r_i+1 时减去这个值即可。

    时间复杂度:O(n)O(n)

    const int maxn = 2e5 + 7;
    int n, m, a[maxn], b[maxn];
    
    void solve()
    {
    	cin >> n >> m;
    	for (int i = 1; i <= m; i++)
    	{
    		int l, r;
    		cin >> l >> r;
    		a[l]++, a[r + 1]--, b[r + 1] -= r - l + 1;
    	}
    
    	for (int i = 1; i <= n; i++)
    		a[i] += a[i - 1];
    
    	for (int i = 1; i <= n; i++)
    	{
    		a[i] += a[i - 1] + b[i];
    		cout << a[i] << " ";
    	}
    	cout << endl;
    }
    
    • 1

    信息

    ID
    6
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者