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 ...
随机推荐
- spring boot 使用第三方jar的方法
2018/02/02 更新 mvnrepository.com已经提供了ms jdbc 的jar URL: http://mvnrepository.com/artifact/com.microsof ...
- c#的WebService和调用
WebService: 1.新建一个空白web应用程序 2.在上面建立的web应用程序添加web服务 4.保存发布至 IIS Client: 1.新建一个程序(可以是winform.控制台.web) ...
- 30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient
渐变有三种:QLinearGradient.QConicalGradient . QRadialGradient 它们都有一个QGradient父类 QGradient父类的常用公共函数有: void ...
- vmware启动黑屏(本来是好的)
在cmd下运行 netsh winsock reset 重启真实系统
- JAVA 多线程(4)
接着3说: 一.String常量池 先回顾 java 的基本数据类型: 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配 ...
- Vue2+VueRouter2+webpack 构建项目实战(二):目录以及文件结构
通过上一篇博文<Vue2+VueRouter2+webpack 构建项目实战(一):准备工作>,我们已经新建好了一个基于vue+webpack的项目.本篇文章详细介绍下项目的结构. 项目目 ...
- RabbitMQ 环境搭建
安装基础环境 yum install net-tools yum install yum yum install gcc glibc-devel make ncurses-devel openssl- ...
- Openlayer3中应用的技术
ol3-ext有很多很丰富的效果,可以不用重复造轮子,ol3-ext示例大全:http://viglino.github.io/ol3-ext/ 在本次项目中使用到了ol3-ext的两个功能:图层管理 ...
- 在C++的函数中如何指定一个数组,使得这个数组的大小由函数的输入值来决定
今天调试一个C++程序,在一个函数中定义了一个一维数组,设定数组的大小由函数的输入值来决定. 是这样子的: ]; 然后发现:报错! 报错是这样的: 那么问题来了,在C++中定义数组一定要指定数组大小么 ...
- bat 批处理获取时间语法格式
bat 批处理获取时间语法格式 取年份:echo %date:~0,4% 取月份:echo %date:~5,2% 取日期:echo %date:~8,2% 取星期:echo %date:~10 ...