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;
}

猜你喜欢

转载自www.cnblogs.com/jklover/p/10388860.html