文章

19

粉丝

69

获赞

30

访问

18.1k

头像
如何在刷出一道墙中理解、设计前缀和数组
P1209
发布于2023年8月4日 16:48
阅读数 963

使用前缀和思想简化时间复杂度,设计前缀和数组,使输出的数组中元素的值代表其对应节点被刷的次数。

首先初始化前缀和数组,使每一个元素等于为0。

该题的巧妙之处就在于:对于每一个输入的索引B与E,B作为开始刷的节点索引令前缀和数组中对应元素的值+1,E+1作为刷墙结束的下一个节点的索引令对应的值-1。这样在所有输入结束后的计算前缀和阶段,在每一个值为[1, -1)的索引区间中的元素值都会加1,而对于某次刷漆终点E的下一个索引为E+1的元素值由于-1而抵消影响(自身值为-1加上之前元素所累积的1而归零),此时数组中元素的值才代表其对应节点被刷的次数。

AC参考代码如下:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    vector<int> colors(200001, 0);

    int B, E;
    while (scanf("%d %d", &B, &E))
    {
        if (B == 0 && E == 0)
        {
            break;
        }
        colors[B]++;      // 刷墙起点标记
        colors[E + 1]--;  // 刷墙终点标记
    }

    // 计算前缀和
    for (int i = 1; i < colors.size(); i++)
    {
        colors[i] += colors[i - 1];
    }

    int begin, end;
    while (scanf("%d %d", &begin, &end))
    {
        if (begin == 0 && end == 0)
        {
            break;
        }
        for (int i = begin; i <= end; i++)
        {
            ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发