C. Little Girl and Maximum Sum

time limit per test2 seconds

memory limit per test256 megabytes

inputstandard input

outputstandard output

The little girl loves the problems on array queries very much.

One day she came across a rather well-known problem: you've got an array of n elements (the elements of the array are indexed starting from 1); also, there are q queries, each one is defined by a pair of integers li, ri (1 ≤ li ≤ ri ≤ n). You need to find for each query the sum of elements of the array with indexes from li to ri, inclusive.

The little girl found the problem rather boring. She decided to reorder the array elements before replying to the queries in a way that makes the sum of query replies maximum possible. Your task is to find the value of this maximum sum.

Input

The first line contains two space-separated integers n (1 ≤ n ≤ 2·105) and q (1 ≤ q ≤ 2·105) — the number of elements in the array and the number of queries, correspondingly.

The next line contains n space-separated integers ai (1 ≤ ai ≤ 2·105) — the array elements.

Each of the following q lines contains two space-separated integers li and ri (1 ≤ li ≤ ri ≤ n) — the i-th query.

Output

In a single line print a single integer — the maximum sum of query replies after the array elements are reordered.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

Examples

inputCopy

3 3

5 3 2

1 2

2 3

1 3

outputCopy

25

inputCopy

5 3

5 2 4 1 3

1 5

2 3

2 3

outputCopy

33

【题意】:有若干对区间和的查询,问如何重组数组使查询结果的和最大。

【分析】:统计每个数出现的次数,则总和最大的策略为:依次让最大的数放在出现查询区间最多的位置上。

重点在于如何快速的统计每个区间总共被查询的次数。可使用线段树的区间更新,也可使用巧妙一点的方法——差分标记,通过一个数组记录下每次查询的 L、 R,然后 cnt[L]++,cnt[R+1]--,然后统计cnt数组前缀和,因为是cnt[R+1]--,所以从头开始遍历计算前缀和不会多统计那些没有查询的区间的次数。

【代码】:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
typedef long long ll;
ll p[maxn];
ll x[maxn];
ll n,q;
ll a[maxn];
int main()
{
while(~scanf("%lld%lld",&n,&q))
{
memset(p,0,sizeof(p));
for(ll i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
while(q--)
{
ll l,r;
scanf("%lld%lld",&l,&r);
p[l]++;
p[r+1]--;
}
for(ll i=1; i<=n; i++)
{
p[i] += p[i-1];
}
sort(p+1,p+n+1);
sort(a+1,a+n+1);
ll sum = 0;
for(ll i=n;i>=1;i--)
{
sum += (ll)(a[i]*p[i]);
}
cout<<sum<<endl;
}
}

最新文章

  1. Shell脚本一枚
  2. iOS检查App新版本并更新新版本
  3. Servlet开发详解
  4. SQL Server 诊断查询-(4)
  5. ios项目记录
  6. 鼠标悬浮图片时弹出透明提示图层的jQuery特效
  7. 绕过CDN查找网站真实IP方法
  8. 【HDOJ】1903 Exchange Rates
  9. android 集成百度地图
  10. [Android] 使用Webview进行OAUTH
  11. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传
  12. 安装phpredis-master步骤备忘
  13. 【转载】pycharm破解,可使用到2099年.pycharm版本 pycharm-professional-2016.3.1
  14. 【Linux】工作管理
  15. MAC常用软件推荐
  16. 喜马拉雅FM接入
  17. Markdown的简单使用
  18. centos7 安装后,出现Please make your choice from above [&#39;q&#39; to quit | &#39;c&#39; to continue | &#39;r&#39; to refresh]
  19. visual studio清理nuget包缓存
  20. java线程阻塞问题排查方法

热门文章

  1. Netscaler重置密码的方法
  2. MySQL in查询优化
  3. BZOJ1115 [POI2009]石子游戏Kam 【博弈论——阶梯游戏】
  4. [学习笔记]最小割之最小点权覆盖&amp;&amp;最大点权独立集
  5. php 上传csv文件
  6. Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况
  7. php2go - Go 实现 PHP 常用内置函数
  8. finally return 执行顺序问题
  9. Linux XZ格式的解压
  10. Linux 开机自动挂载windows分区