B. Yet Another Array Partitioning Task ——cf
2 seconds
256 megabytes
standard input
standard output
An array bb is called to be a subarray of aa if it forms a continuous subsequence of aa , that is, if it is equal to alal , al+1al+1 , …… , arar for some l,rl,r .
Suppose mm is some known constant. For any array, having mm or more elements, let's define it's beauty as the sum of mm largest elements of that array. For example:
- For array x=[4,3,1,5,2]x=[4,3,1,5,2] and m=3m=3 , the 33 largest elements of xx are 55 , 44 and 33 , so the beauty of xx is 5+4+3=125+4+3=12 .
- For array x=[10,10,10]x=[10,10,10] and m=2m=2 , the beauty of xx is 10+10=2010+10=20 .
You are given an array a1,a2,…,ana1,a2,…,an , the value of the said constant mm and an integer kk . Your need to split the array aa into exactly kk subarrays such that:
- Each element from aa belongs to exactly one subarray.
- Each subarray has at least mm elements.
- The sum of all beauties of kk subarrays is maximum possible.
The first line contains three integers nn , mm and kk (2≤n≤2⋅1052≤n≤2⋅105 , 1≤m1≤m , 2≤k2≤k , m⋅k≤nm⋅k≤n ) — the number of elements in aa , the constant mm in the definition of beauty and the number of subarrays to split to.
The second line contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109 ).
In the first line, print the maximum possible sum of the beauties of the subarrays in the optimal partition.
In the second line, print k−1k−1 integers p1,p2,…,pk−1p1,p2,…,pk−1 (1≤p1<p2<…<pk−1<n1≤p1<p2<…<pk−1<n ) representing the partition of the array, in which:
- All elements with indices from 11 to p1p1 belong to the first subarray.
- All elements with indices from p1+1p1+1 to p2p2 belong to the second subarray.
- …… .
- All elements with indices from pk−1+1pk−1+1 to nn belong to the last, kk -th subarray.
If there are several optimal partitions, print any of them.
9 2 3
5 2 5 2 4 1 1 3 2
21
3 5
6 1 4
4 1 3 2 2 3
12
1 3 5
2 1 2
-1000000000 1000000000
0
1
In the first example, one of the optimal partitions is [5,2,5][5,2,5] , [2,4][2,4] , [1,1,3,2][1,1,3,2] .
- The beauty of the subarray [5,2,5][5,2,5] is 5+5=105+5=10 .
- The beauty of the subarray [2,4][2,4] is 2+4=62+4=6 .
- The beauty of the subarray [1,1,3,2][1,1,3,2] is 3+2=53+2=5 .
The sum of their beauties is 10+6+5=2110+6+5=21 .
In the second example, one optimal partition is [4][4] , [1,3][1,3] , [2,2][2,2] , [3][3] .
大意:
这个题目是给你n个数据,让你分成k段,每一段至少m个数,并且把每一段的前m大的数求和
输出求和的结果,和分段的位置、
思路:
是求这每一段的前m大的数,其实可以转化成,求这一组数前m*k大的数之和。
至于求分段的位置,这个就有点麻烦了,可以把每一个位置初始标记为0,
然后在求sum的同时,将求过的数位置标记成1,之后求分段位置的时候,
就可以进行累加,一旦累加之和为m,说明这m个数组成了一段,也就是在这个位置将数组分段。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct node
{
int x,id;
}a[maxn];
bool vis[maxn];
bool cmp(node a,node b)
{
return a.x>b.x;
}
int main()
{
int n,m,k;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
ll sum=0;
for(int i=1;i<=m*k;i++)
{
sum+=a[i].x;
vis[a[i].id]=1;
//printf("a.id=%d\n",a[i])
}
printf("%I64d\n",sum);
int s=0;;
for(int i=1;i<=n;i++)
{
s=s+vis[i];
// printf("%d %d\n",i,s);
if(s==m&&k!=1)
{
k--;
s=0;
printf("%d ",i);
}
}
printf("\n");
return 0;
}
B. Yet Another Array Partitioning Task ——cf的更多相关文章
- CF#538(div2) B. Yet Another Array Partitioning Task 【YY】
任意门:http://codeforces.com/contest/1114/problem/B B. Yet Another Array Partitioning Task time limit p ...
- CF1114B Yet Another Array Partitioning Task
CF1114B Yet Another Array Partitioning Task 贪心,选择前 \(k*m\) 大的元素对答案进行贡献. 每次划分时,从当前位置往后扫,扫到 \(m\) 个前 \ ...
- CF1114B Yet Another Array Partitioning Task(贪心,构造题)
我至今不敢相信我被这么一道简单的题卡了这么久……看来还是太弱了…… 题目链接:CF原网 题目大意:定义一个序列的“美丽度”为这个序列前 $m$ 大的数的和.现在有一个长度为 $n$ 的序列,你需要把它 ...
- 【Codeforces 1114B】Yet Another Array Partitioning Task
[链接] 我是链接,点我呀:) [题意] 让你把数组分成k个连续的部分 使得每个部分最大的m个数字的和最大 [题解] 把原数组降序排序 然后选取前m*k个数字打标记 然后对于原数组 一直贪心地取 直到 ...
- Codeforces - 1114B - Yet Another Array Partitioning Task - 构造 - 排序
https://codeforces.com/contest/1114/problem/B 一开始叫我做,我是不会做的,我没发现这个性质. 其实应该很好想才对,至少要选m个元素,其中m个作为最大值,从 ...
- codeforces-473D Mahmoud and Ehab and another array construction task (素数筛法+贪心)
题目传送门 题目大意:先提供一个数组,让你造一个数组,这个数组的要求是 1 各元素之间都互质 2 字典序大于等于原数组 3 每一个元素都大于2 思路: 1.两个数互质的意思就是没有公因子.所以每 ...
- Codeforces 959D. Mahmoud and Ehab and another array construction task(构造, 简单数论)
Codeforces 959D. Mahmoud and Ehab and another array construction task 题意 构造一个任意两个数都互质的序列,使其字典序大等于a序列 ...
- D. Mahmoud and Ehab and another array construction task 因子分界模板+贪心+数学
D. Mahmoud and Ehab and another array construction task 因子分解模板 题意 给出一个原序列a 找出一个字典序大于a的序列b,使得任意 \(i!= ...
- CF959D Mahmoud and Ehab and another array construction task 数学
Mahmoud has an array a consisting of n integers. He asked Ehab to find another array b of the same l ...
随机推荐
- Hangfire定时任务设置CronExpression表达式
Cron format helper This utility helps you build Cron expressions easily by choosing job scheduling s ...
- Java学习笔记之——单例模式
(1)懒汉式:对象在方法中,第一次调用时创建对象,线程不安全的 public class Singleton { //外部不可以创建对象,就要在内部创建一个对象,还能够在外部获取 private ...
- python基础学习(七)列表
列表的定义 List(列表) 是 Python 中使用 最频繁 的数据类型,在其他语言中通常叫做 数组(例如java.c) 专门用于存储 一串 信息 列表用 [] 定义,数据 之间使用 , 分隔 列表 ...
- 怎么打开在.bashrc文件以及设置颜色
打开/etc/bashrc,加入如下一行: alias ls="ls --color" 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了,其中不同颜 ...
- spring-framework-中文文档三:依赖注入DI
5.4依赖性 典型的企业应用程序不包含单个对象(或Spring的说法中的bean).即使最简单的应用程序也有几个对象一起工作来展示最终用户将其视为一个连贯的应用程序.下一节将介绍如何从定义许多独立的b ...
- 几点建议帮你写出简洁的JS代码
译者按: 规范的代码可以有效避免代码bug,fundebug才会报警少一点! 原文: Tips for Writing Cleaner Code 译者: Fundebug 为了保证可读性,本文采用意译 ...
- 判断文本是否溢出/hover显示全部
前言 在工作中我们经常会遇到,文字过多,需要用省略号,并且鼠标hover的时候 还需要 显示全部的文字的需求. 正文 文字过多需要用省略号的实现:上代码啦 .ellipsis { width: 100 ...
- jQuery根据元素值或元素下标来删除一个数组元素及数组对象方法列表
在前提不知道b在这个数组的下标,删除b这个元素 var arrList = ['a','b','c','d']; arrList.splice(jQuery.inArray('b', ...
- php使用fullcalendar日历插件
最近做课程表的项目,找了好多个插件感觉都不好用,无意间看到了fullcalendar,还挺简单的,很方便,先贴一张项目页面 <!DOCTYPE html> <html> < ...
- elementUI vue 页面加载的时候页面出现了黑字 页面优化处理 按钮弹出框文字
elementUI 页面如果需要加载很多东西的时候, 自己定义的按钮或者弹出框dialog的文字就会显示在页面上, 一闪而过, 因此需要优化一下, elementUI 提供的loading有遮罩层, ...