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
,以确保以最高的质量和金额获得最多的检查次数
希望这有帮助