蓝桥集训之重新排序
-
核心思想:差分
- 利用差分 在一段区间内++ 最终求和得到每个位置数计算的次数
- 然后分别从大到小排序w[i]和s[i]数组
-
#include<iostream>#include<algorithm>using namespace std;typedef long long LL;const int N = 100010;int w[N],s[N];int n,m;int main(){cin>>n;for(int i=1;i<=n;i++) cin>>w[i];cin>>m;while(m--){int l,r;cin>>l>>r;s[l] ++ ,s[r+1]--; //求差分数组}for(int i=1;i<=n;i++) s[i] += s[i-1]; //求前缀和(每个数出现多少次)LL sum1=0;for(int i=1;i<=n;i++){sum1 += (LL)s[i] * w[i]; //原始数和}LL sum2=0;sort(s+1,s+n+1);sort(w+1,w+n+1);for(int i=1;i<=n;i++){sum2 += (LL)s[i]*w[i]; //最大数和}cout<<sum2-sum1;}