C. Little Girl and Maximum Sum差分 / 贪心

Posted 辉小歌

tags:

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


贪心,思路很简单。肯定是公共次数最多的,放最大的值。以此类推。
我们可以用差分来维护,快速的给区间加1。最后统计每一个点背统计的次数。
然后将数值按照从大到小。给出现次数多的点赋值构造数组。最后前缀和统计。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
typedef pair<int,int> PII;
LL a[N],b[N],c[N],s[N],n,m;
vector<PII>ve,temp;
void add(int l,int r)

	b[l]+=1;
	b[r+1]-=1;

bool cmp(PII a,PII b)return a.first>b.first;
bool cmp1(int a,int b)return a>b;
int main(void)

	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=0;i<m;i++)
	
		int l,r; cin>>l>>r;
		ve.push_back(l,r);
		add(l,r);
	
	for(int i=1;i<=n;i++) b[i]+=b[i-1];
	for(int i=1;i<=n;i++) temp.push_back(b[i],i);
	sort(temp.begin(),temp.end(),cmp);
	sort(a+1,a+n+1,cmp1);
	for(int i=1;i<=n;i++) c[temp[i-1].second]=a[i];
	for(int i=1;i<=n;i++) s[i]=s[i-1]+c[i];
	LL sum=0;
	for(int i=0;i<m;i++)
	
	    int l=ve[i].first,r=ve[i].second;
	    sum+=s[r]-s[l-1];
	
	cout<<sum;
	return 0;

以上是关于C. Little Girl and Maximum Sum差分 / 贪心的主要内容,如果未能解决你的问题,请参考以下文章

Little Girl and Maximum XOR CodeForces - 276D

Little Girl and Maximum Sum CodeForces - 276C

CF276E Little Girl and Problem on Trees 题解

D. Little Girl and Maximum XOR(贪心)

B. Little Girl and Game1300 / 回文字符串 博弈论

HDU - 4422-The Little Girl who Picks Mushrooms