Codeforces Round #169 (Div. 2)C. Little Girl and Maximum Sum

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #169 (Div. 2)C. Little Girl and Maximum Sum相关的知识,希望对你有一定的参考价值。

传送门

Description

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 liri (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 %I64dspecifier.

Sample Input

3 3
5 3 2
1 2
2 3
1 3
5 3
5 2 4 1 3
1 5
2 3
2 3

Sample Output

25

33

思路

题意:

给出n个数和q个区间查询,问如何排列这n个数,使得区间查询的数的总和最大。

题解:

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

 

#include<bits/stdc++.h>
using namespace std;
typedef __int64 LL;
const int maxn = 200005;
int a[maxn],cnt[maxn];

bool cmp(int x,int y)
{
	return x >= y;
}

int main()
{
	//freopen("input.txt","r",stdin);
	int n,q,l,r;
	LL res = 0;
	memset(cnt,0,sizeof(cnt));
	scanf("%d%d",&n,&q);
	for (int i = 1;i <= n;i++)	scanf("%d",&a[i]);
	while (q--)
	{
		scanf("%d%d",&l,&r);
		cnt[l]++;
		cnt[r+1]--;
	}
	for (int i = 1;i <= n;i++)	cnt[i] += cnt[i-1];
	sort(a+1,a+n+1);
	sort(cnt+1,cnt+n+1);
	for (int i = n;i > 0;i--)
	{
		res += LL(a[i])*(LL)cnt[i];
	}
	printf("%I64d\n",res);
	return 0;
}

  

以上是关于Codeforces Round #169 (Div. 2)C. Little Girl and Maximum Sum的主要内容,如果未能解决你的问题,请参考以下文章

[ACM]Codeforces Round #534 (Div. 2)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

Codeforces Global Round 19

Codeforces Educational Codeforces Round 67

Codeforces Round 1132Educational Round 61

codeforces Technocup 2017 - Elimination Round 2/Codeforces Round #380 (Div. 2, Rated, Based on Techn