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 ;
}
```

浙公网安备 33010602011771号