CF276C题解

这道题的思路非常简单,经过对样例的分析,我们发现,所有区间的总和为:

$\sum_{i = 1}^{n} a_i \times d_i $(其中 $a_i$ 为原数组的第 $i$ 项,$d_i$ 为第 $i$ 个元素被区间覆盖的次数)

这里有一个小细节:对于某一个元素被覆盖的次数我们可用差分进行优化。

所以,
```cpp
sort(a + 1,a + 1 + n)
sort(q + 1,q + 1 + n)
```
对数组进行排序后,求得 $\sum_{i = 1}^{n} a_i \times d_i $ 并输出即可。

接下来是代码实现:

```cpp
#include<bits/stdc++.h>
using namespace std;
int n , q , a[200005] , l , r , d[200005] , ans ;
signed main(){
cin >> n >> q ;
for( int i = 1 ; i <= n ; i ++ ){
cin >> a[i] ;
}
sort( a + 1 , a + 1 + n ) ;
for( int i = 1 ; i <= q ; i ++ ){
cin >> l >> r ;
d[l] ++ ;
d[r + 1] -- ;
}
for( int i = 1 ; i <= n ; i ++ ){
d[i] += d[i - 1] ;
}
sort( d + 1 , d + 1 + n ) ;
for( int i = 1 ; i <= n ; i ++ ){
ans += d[i] * a[i] ;
}
cout << ans ;
return 0 ;
}
```

posted @ 2023-11-15 23:06  SSSSSSSSSSoil  阅读(39)  评论(0)    收藏  举报