AcWing:109. 天才ACM(倍增 + 归并排序)
给定一个整数 MM,对于任意一个整数集合 SS,定义“校验值”如下:
从集合 SS 中取出 MM 对数(即 2∗M2∗M 个数,不能重复使用集合中的数,如果 SS 中的整数不够 MM 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值就称为集合 SS 的“校验值”。
现在给定一个长度为 NN 的数列 AA 以及一个整数 TT。
我们要把 AA 分成若干段,使得每一段的“校验值”都不超过 TT。
求最少需要分成几段。
输入格式
第一行输入整数 KK,代表有 KK 组测试数据。
对于每组测试数据,第一行包含三个整数 N,M,TN,M,T 。
第二行包含 NN 个整数,表示数列A1,A2…ANA1,A2…AN。
输出格式
对于每组测试数据,输出其答案,每个答案占一行。
数据范围
1≤K≤121≤K≤12,
1≤N,M≤5000001≤N,M≤500000,
0≤T≤10180≤T≤1018,
0≤Ai≤2200≤Ai≤220
输入样例:
2
5 1 49
8 2 1 7 9
5 1 64
8 2 1 7 9
输出样例:
2
1
算法:倍增 + 归并
注意:本题不能直接用sort排序,会时间超限,必须用归并来优化排序。
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; typedef long long ll; const int maxn = 5e5+; ll n, m, k;
ll arr[maxn];
ll a[maxn];
ll b[maxn]; void merge(int l, int mid, int r) {
int i = l, j = mid;
int t = l;
while(i < mid || j <= r) {
if((i < mid && a[i] <= a[j]) || j > r) {
b[t++] = a[i++];
} else {
b[t++] = a[j++];
}
}
} bool check(int l, int mid, int r) {
for(int i = mid; i <= r; i++) {
a[i] = arr[i];
}
sort(a + mid, a + r + ); //在mid之前的数都是有序的,从mid开始就是copy的arr数组中的值,所以需要变成有序才能归并
merge(l, mid, r);
ll sum = ;
for(int i = l, j = r, cnt = ; cnt < m && i < j; i++, j--, cnt++) {
sum += (b[j] - b[i]) * (b[j] - b[i]);
}
if(sum <= k) {
for(int i = l; i <= r; i++) {
a[i] = b[i];
}
return true;
}
return false;
} int main() {
int T;
scanf("%d", &T);
while(T--) {
cin >> n >> m >> k;
for(int i = ; i <= n; i++) {
cin >> arr[i];
}
int l = , r = , h = ;
a[l] = arr[l];
int ans = ;
while(r <= n) {
if(h == ) { //当长度不可取的时候,就开始匹配下一段
ans++;
r++;
l = r;
h = ;
a[l] = arr[l];
} else if(r + h <= n && check(l, r + , r + h)) {
r += h;
h *= ;
if(r == n) {
break;
}
} else {
h /= ;
}
}
if(r == n) {
ans++;
}
cout << ans << endl;
}
return ;
}
AcWing:109. 天才ACM(倍增 + 归并排序)的更多相关文章
- 天才ACM
天才ACM 给定一个整数m,定义一个集合的权值为从这个集合中任意选出m对数(不够没关系,选到尽可能选,凑不成对的舍去),每对数两个数的差的平方的和的最大值. 现在给出一个数列\(\{a_i\}\),询 ...
- hihocoder1384/CH0601 Genius ACM[贪心+倍增+归并排序]
提交地址. 关于lyd给的倍增方法,即从当前枚举向后的$2^k$长度($k$从$1$开始),如果可行就将$k$加一以扩大范围,不可行时将范围不断减半直至$0$. 举个例子,假设当下在1,目标答案是13 ...
- hihocoder--1384 -- Genius ACM (倍增 归并)
题目链接 1384 -- Genius ACM 给定一个整数 m,对于任意一个整数集合 S,定义“校验值”如下:从集合 S 中取出 m 对数(即 2*M 个数,不能重复使用集合中的数,如果 S 中的整 ...
- $CH0601\ Genius\ ACM$ 倍增优化DP
ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...
- AcWing 107. 超快速排序(归并排序 + 逆序对 or 树状数组)
在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 ...
- AcWing 1273. 天才的记忆
从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏. 在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏. 题目是这样的:给你一大串 ...
- AcWing 369. 北大ACM队的远足
\(\text{Update on 2020.3.25}\) 我之前的做法也有问题,讨论还是不够严谨,导致又有几组(见 打卡评论区)\(\text{Hack}\) 此题数据极水,这里有几种错误写法: ...
- CH0601 Genius ACM【倍增】【归并排序】
0601 Genius ACM 0x00「基本算法」例题 描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数 ...
- HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)
Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- 帝国cms 此栏目暂无任何新增信息处理办法
在做一个新网站的时候不能保证每个栏目都能填充内容,当某个栏目没有内容填充的时候总会出现“此栏目暂无任何新增信息”看着挺不舒服. 其实想删除这行字也挺简单,只需要修改下语言包即可!如下: 找到语言包文件 ...
- 1 sql server 中cursor的简介
1.游标的分类 游标共有3类:API服务器游标.Transaction-SQL游标和API客户端游标. 2 API服务器cursor共有如下几种 静态游标的完整结果集将打开游标时建立的结果集存储在临时 ...
- Redis-设置key过期
Redis-设置key过期 expire key seconds 设置指定key 多少秒后过期, seconds 为 -1 时表示永不过期 ttl key 查看指定key还有多少秒过期 persist ...
- MySQL添加唯一索引
1 语法如下 ALTER TABLE `t_user` ADD unique(`username`);
- MacOs上的Intellij idea高频快捷键总结(2018.1版本)
高频快捷键 查找类快捷键 command + F12 查看当前类方法变量 command + E 查看最近文件 Alt+F1 ...
- 建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序
在Windows平台上主要有两个版本的Socket Api函数:WinSock 1.1和WinSock 2.2 , 2.2版本默认兼容1.1版本,1.1 winsock.h wsock32.lib w ...
- Yii2常用操作
获取添加或修改成功之后的数据id $insert_id = $UserModel->attributes['id']; 执行原生sql $list = Yii::$app->db-> ...
- NIM 1
博弈论(一):Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算. Nim游戏是博 ...
- 搭建单机版伪分布zookeeper集群
一.下载zookeeper http://mirrors.shu.edu.cn/apache/zookeeper/stable/ 我下载的是3.4.13版本 上传到liunx虚拟机上,解压 再复制出2 ...
- Vue-指令补充、过滤器、计数器属性、监听属性
vue实例成员: el | template |data | methods watch 监听事件| computed 计数属性使用 | filters过滤器 | props 父传子 componen ...