[hihocoder #1384] Genius ACM 解题报告(倍增)
题目链接:http://hihocoder.com/problemset/problem/1384
题目大意:
给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下:
从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 M 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值 就称为集合 S 的“校验值”。
现在给定一个长度为 N 的数列 A 以及一个整数 T。我们要把 A 分成若干段,使得 每一段的“校验值”都不超过 T。求最少需要分成几段。
题解:
现在对于一个数列,它的校验值就是排序之后第一大的和第一小的配对,第二大的和第二小的配对....
现在我们让段数尽可能少,就是让每段尽可能长
于是问题就是转化成了确定区间右端点L,左端点最远是哪里的问题
二分显然是可行的,但是这样常数太大了,我们考虑倍增
1.初始化p=1,R=L
2.求出[L,R+p]这段区间的校验值,如果<=k,那么L+=p,p<<=1,否则p>>=1
3.重复上一步直到p=0退出,更新L=R+1
怎么求校验值呢?一个显然的方法就是我们每次都排序
这样显然有大量浪费
考虑我们每次计算[L,R+p]的时候归并处理,时间复杂度降到$O(nlogn)$
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll; const int N=5e5+;
int T,n,m;
ll k;
ll a[N],b[N],c[N];
inline ll read()
{
char ch=getchar();
ll s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void mergy(int l,int r,int mid)
{
int i=l,j=mid;
for (int k=l;k<=r;k++)
{
if ((b[i]<b[j]&&i<mid)||j>r) c[k]=b[i++];
else c[k]=b[j++];
}
}
int L,R;
void merge_sort(int l,int r)
{
for (int i=R+;i<=r;i++) b[i]=a[i];
sort(b+R+,b+r+);
mergy(l,r,R+);
}
ll calc(int l,int r)
{
merge_sort(l,r);
ll re=,cnt=;
for(int i=l,j=r;i<j;i++,j--)
{
re+=1ll*(c[i]-c[j])*(c[i]-c[j]);
cnt++;
if(cnt==m) break;
}
return re;
}
int solve()
{
int p=;
R=L;b[L]=a[L];
while (p)
{
if (R+p<=n&&calc(L,R+p)<=k)
{
R+=p;
p<<=;
for (int i=L;i<=R;i++) b[i]=c[i];
}
else p>>=;
if (R>n) break;
}
return R;
}
int main()
{
T=read();
while (T--)
{
n=read();m=read();k=read();
for (int i=;i<=n;i++) a[i]=read();
int re=;
L=;
while (L<=n)
{
int k=solve();
L=k+;
re++;
}
printf("%d\n",re);
}
return ;
}
[hihocoder #1384] Genius ACM 解题报告(倍增)的更多相关文章
- hihoCoder#1384 : Genius ACM
对于一个固定的区间$[l,r]$,显然只要将里面的数字从小到大排序后将最小的$m$个和最大的$m$个配对即可. 如果固定左端点,那么随着右端点的右移,$SPD$值单调不降,所以尽量把右端点往右移,贪心 ...
- 山东省第四届acm解题报告(部分)
Rescue The PrincessCrawling in process... Crawling failed Description Several days ago, a beast ca ...
- hihocoder 1193 树堆 解题报告
题目大意:给出一棵有根树(根为 \(0\) ),点有点权.可以删除点(非根),并将其子树接到其父亲上.我们称一个树为树堆当前仅当树上每个点都满足其权值大于等于其子树中所有点的点权.现在对于每个点要求其 ...
- hihocoder--1384 -- Genius ACM (倍增 归并)
题目链接 1384 -- Genius ACM 给定一个整数 m,对于任意一个整数集合 S,定义“校验值”如下:从集合 S 中取出 m 对数(即 2*M 个数,不能重复使用集合中的数,如果 S 中的整 ...
- 2014 ACM/ICPC 鞍山赛区现场赛 D&I 解题报告
鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...
- CH0601 Genius ACM【倍增】【归并排序】
0601 Genius ACM 0x00「基本算法」例题 描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数 ...
- ACM: Just a Hook 解题报告 -线段树
E - Just a Hook Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- ACM -- 算法小结(七)Phone list解题报告
HDOJ -- Phone list解题报告 问题描述:给出一些电话号码,如果有共同前缀则输出NO,如果没有则输出YES. 解题关键:将电话号码进行字符串排序,相邻的电话号码进行比较 Sa ...
- 北大ACM试题分类+部分解题报告链接
转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...
随机推荐
- c语言数组小谈
#include <stdio.h> #include <stdlib.h> #define N 5 int main() { double score[5]; int i; ...
- 【转】Core Bluetooth框架之二:后台处理
原文网址:http://southpeak.github.io/blog/2014/07/31/core-bluetoothkuang-jia-zhi-er-:hou-tai-chu-li/ 在开发B ...
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来
import java.util.LinkedList; import java.util.Scanner; public class Main { private static LinkedList ...
- 对MySQL交换分区的实践
前言 在介绍交换分区之前,我们先了解一下 mysql 分区. 数据库的分区有两种:水平分区和垂直分区.而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区.水平分区即:以行为单位对表进行分区.比 ...
- SpringBoot(九) ElasticSearch 全文检索
ElasticSearch ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用 ...
- Android实现图片相似度
Android实现图片相似度 最近公司有一个需求,就是希望能判断用户提交的照片是否是身份证的正面或者反面.可以通过预设一张拍摄清晰的身份证正面或者反面,来对比是否相似,那么问题就转化为如何计算两张图片 ...
- 关于iOS11上MJRefresh tabview刷新后,重新加载另一组数据, 回不到顶部或者头尾显示混乱等问题解决
MJRefresh在iOS11上存在很多bug 比如在iphoenx上首尾仍会显示的问题 刷新数据后tableview置顶不上去等问题 虽然官方给出了适配方案 但是问题还没有的到解决 比如tabvi ...
- NYOJ 71 独木舟上的旅行【贪心】
解题思路:给出船的最大载重量w,和n个人,每只船最多可以乘坐两个人,问怎样坐船使得安排的船只的数量最少.这n个人的体重为a1,a2,a3,---,an-1,an首先将体重按升序排列好,再考虑最重的人, ...
- 高次不定方程BSGS算法
学习数学真是一件赛艇的事. BSGS名字听起来非常有意思,力拔山兮气盖世,北上广深,小步大步...算法其实更有意思,它是用来求解一个方程的 \(A^x≡B mod P\) 是不是特别眼熟,有几个式子长 ...
- 我的nginx+php是如何配置的?
nginx使用homebrew安装,安装之后 ngxin 安装目录:/usr/local/Cellar/nginx/1.8.0 删除掉默认的www目录,创建一个自己方便找到的 删除掉默认的www目录 ...