Gold Rong 的数组

66 阅读2分钟

Gold Rong 有一个长度为 n 的数组,下标从 1 开始。刚开始所有元素都是 0 。

Gold Rong 现在要对数组进行 q 次修改,每次修改时 Gold Rong 会选一个位置 x 和一个正整数 y ,随后将数组中的每一个元素 aia_iai​ 的值加上 max(y−abs(x−i),0 。具体修改方式可以参考样例。

经过 q 次修改后,Gold Rong 想知道他的数组变成了什么样子,请你告诉他。

输入描述:

第一行输入两个正整数 n (1≤n≤105) 和 q (1≤q≤105) ,表示数组的长度与修改的次数。

接下来 q 行,每行两个正整数 x (1x≤n)xy (1y106) ,表示一次修改操作。保证所有 y 的总和不超过 106

输出描述:

输出一行 n 个整数,表示 Gold Rong 经过 q 次修改后的数组。

示例1

输入

复制 5 2 2 3 4 1

5 2
2 3
4 1

输出

复制 2 3 2 2 0

2 3 2 2 0

说明

Gold Rong 的数组长度为 5 ,对数组的 2 次修改操作分别是 x=2,y=3;x=4,y=1 。最终结果是 2,3,2,2,0。修改过程如下图:

示例2

输入

复制 6 3 2 6 2 5 2 4

6 3
2 6
2 5
2 4

输出

复制 12 15 12 9 6 3

12 15 12 9 6 3

说明

Gold Rong 的数组长度为 6 ,对数组的 3 次修改操作分别是 x=2,y=6 ;x=2,y=5x=2,y=5x=2,y=5 ;x=2,y=4 。最终结果是12,15,12,9,6,3。修改过程如下图:

思路:其实也很简单就是模拟一遍ok了 代码;

#include <bits/stdc++.h>

using namespace std;
#define YES cout << "YES" << '\n'
#define NO cout << "NO" << '\n'
constexpr int maxn = 1E5 + 3;
std::array<int, maxn> A;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);
    
    int n, q;
    std::cin >> n >> q;

    while (q--) {
        int x, y;
        std::cin >> x >> y;

        int l = std::max(1, x - y + 1), r = std::min(n, x + y - 1);

        for (int i = l; i <= r; ++i) {
            A[i] += std::max(y - std::abs(x - i), 0);
        }
    }

    for (int i = 1; i <= n; ++i) {
        std::cout << A[i] << " \n"[i == n];
    }

    return 0;
}