C++ 这两个数组向量如何帮助获得每个元素的计数?

C++ 这两个数组向量如何帮助获得每个元素的计数?,c++,arrays,vector,C++,Arrays,Vector,在下面的代码中,b和c以某种方式帮助计算总和时获得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&g

在下面的代码中,
b
c
以某种方式帮助计算总和时获得
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;
}
#包括
#包括

#include

这里首先要注意的是,所做的查询是基于1的,所以

b[l-1]++;
b[r]--;
实际上,在检查员想要检查的第一个索引处递增,在他想要检查的范围之外递减第一个值

现在,
b
所做的就是跟踪检查员将要查看的范围,因此如果我们为j
设置
d[i]=sum(b[j]),那么如果检查员将要查看此面条包,我们将得到
d[i]=1
,否则为
0
(仅用于1个查询)。因此,
c
所做的就是将查询中所有不同的
d
相加,使之成为之前(
c[i-1]
)和
b
b[i]
)中新信息的总和(类似于所有查询的
c[i]=sum(d[i])

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

因此,
c[i]
向我们显示了将对
i
-th面条进行检查的次数。排序并乘以排序后的
a
,以确保以最高的质量和金额获得最多的检查次数

希望这有帮助