【问题标题】:How these two arrays vectors helping to get each element count?这两个数组向量如何帮助获取每个元素的计数?
【发布时间】:2015-07-04 04:36:49
【问题描述】:

在下面的代码中,bc 以某种方式帮助在计算总和时获取 a 的每个元素的计数。我无法掌握其背后的逻辑请帮助。

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    int n,q,l,r;
    long long int ans=0;
    scanf("%d%d",&n,&q);
    vector<int> a(n,0);
    vector<int> b(n+1,0);
    vector<int> c(n,0);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    while(q--)
    {
        scanf("%d%d",&l,&r);
        b[l-1]++;
        b[r]--;
    }
    c[0]=b[0];
    for(int i=1;i<n;i++) c[i]=c[i-1]+b[i];
    sort(c.begin(),c.end());
    sort(a.begin(),a.end());
    for(int i=0;i<n;i++)
    {
        ans+=a[i]*c[i];
    }
    printf("%lld",ans);
    return 0;
}

请解释b[]c[] 是如何提供帮助的。

Link to problem

【问题讨论】:

    标签: c++ arrays vector


    【解决方案1】:

    首先要注意的是,查询是从 1 开始的,所以

    b[l-1]++;
    b[r]--;
    

    实际上在检查员想要查看的第一个索引处递增,并在他想要查看的范围之外递减第一个值。

    现在,b 正在做的是跟踪检查员要查看的范围,所以如果我们设置d[i] = sum(b[j]) for j &lt; i,如果检查员要查看这个面条包,我们就有d[i] = 1 , 和 0 否则(仅适用于 1 个查询)。 c 所做的就是总结来自查询的所有不同的 d,使其成为之前 (c[i-1]) 和来自 b (b[i]) 的新信息的总和(有点像 @987654331 @。

    如果您仍然看不到,请这样想:当您添加b[i],而您之前是0,而您刚刚开始一个新查询b[i] = 1c[i-1] = 0。现在,c[i] = 1b[i+1] = 0,因为您仍在范围内。这将一直持续到您点击b[j] = -1,我们仍然有c[j-1] = 1,但将它们加起来让我们回到0,并将保持c[k] = 0,直到新的查询开始或结束。您可以很容易地看到,在同一范围内对b 进行额外更改将使逻辑保持有效。

    因此c[i]向我们展示了i-th 面条将被检查多少次。排序并乘以已排序的a,以确保您获得最高质量和最高数量的检查。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2021-09-08
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多