CF1114B Yet Another Array Partitioning Task

CF1114B Yet Another Array Partitioning Task

  • 贪心,选择前 (k*m) 大的元素对答案进行贡献.
  • 每次划分时,从当前位置往后扫,扫到 (m) 个前 (k*m) 大的元素时就将该区间划出.
  • 时间复杂度为排序时间复杂度 (O(nlogn)) .
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
	int x=0;
	bool pos=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar())
		if(ch=='-')
			pos=0;
	for(;isdigit(ch);ch=getchar())
		x=x*10+ch-'0';
	return pos?x:-x;
}
const int MAXN=2e5+10;
int n,m,k;
int a[MAXN];
struct nd{
	int x,y;
}b[MAXN];
int cmp(nd x,nd y)
{
	return x.x==y.x?x.y<y.y:x.x>y.x;
}
int c[MAXN],tp;
ll ans=0;
bool tag[MAXN];
int stk[MAXN];
int main()
{
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;++i)
		{
			a[i]=read();
			b[i].x=a[i],b[i].y=i;
		}
	sort(b+1,b+1+n,cmp);
	for(int i=1;i<=k*m;++i)
		tag[b[i].y]=1;
	int j=0;
	for(int i=1;i<=k;++i)
		{
			int oj=j;
			int L=oj+1,R=n-m*(k-i);
			int p;
			int cnt=0;
			for(j=L;j<=R;j++)
				{
					if(tag[j])
						++cnt,ans+=a[j];
					if(cnt==m)
						break;
				}
			stk[i]=j;
		}
	cout<<ans<<endl;
	for(int i=1;i<k;++i)
		printf("%d ",stk[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/jklover/p/10388860.html