XJOI 7191 Genius ACM
二分+倍增
题目
题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值……进行做差平方取和
所以在加入一个新的数时,校验值是不会下降的
那么可以发现,校验值是单调递增的,所以可以用二分对每一个固定的左段点找到满足条件的最大的右端点
所以l初始值设为1,不断对r进行二分,找到最大的点
进行二分时要用二进制数(倍增),不能直接取mid
设一个偏量p,右端点即为r+p,一开始设为1,然后对其判断,在k的范围内p就乘2,否则p除以2
进行判断时,将整个区间进行排序,取前m个数和后m个数分别做差,算出值与k比较
但此时时间复杂度为O(n*logn*logn),对于n=5*1e5是过不了的
而排序用的时间最多,所以要利用之前排好的元素进行归并排序
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN=5*1e5+100;
ll t,n,m,k,a[MAXN],b[MAXN],p;
ll ans,c[MAXN];
bool check(ll l,ll r)
{
ll tot=0;
for (ll i=0;i<m;i++)
{
if (l+i>r-i)
break;
tot+=(c[l+i]-c[r-i])*(c[l+i]-c[r-i]);
}
return tot<=k;
}
void merge(ll la,ll ra,ll lb,ll rb)//合并两个有序数组
{
ll l,r,now;
l=la;
r=lb;
now=la-1;
while (l<=ra && r<=rb)
{
if (b[l]<=b[r])
{
now++;
c[now]=b[l];
l++;
}
else
{
now++;
c[now]=b[r];
r++;
}
}
for (ll i=l;i<=ra;i++)
{
now++;
c[now]=b[i];
}
for (ll i=r;i<=rb;i++)
{
now++;
c[now]=b[i];
}
}
int main()
{
scanf("%lld",&t);
while (t--)
{
scanf("%lld%lld%lld",&n,&m,&k);
for (ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
ll l,r;
l=1;
ans=0;
while (l<=n)
{
ans++;//统计答案
p=1;
r=l;
b[l]=a[l];
while (p)
{
if (r+p>n)
{
p>>=1;
continue;
}
for (int i=r+1;i<=r+p;i++)//r之前的元素已经排好了序,所以对[r+1,r+p]的元素排序
b[i]=a[i];
sort(b+r+1,b+r+p+1);
merge(l,r,r+1,r+p);//将两个区间的元素合并
if (check(l,r+p))
{
for (int i=l;i<=r+p;i++)//注意,这句不能放在merge函数中,因为p有可能变小,之前排好序的元素可能排到了r之后,在之后统计答案时无法统计到
b[i]=c[i];
r+=p;
p<<=1;
}
else
{
p>>=1;
}
}
l=r+1;
}
printf("%lld\n",ans);
}
}
XJOI 7191 Genius ACM的更多相关文章
- hihocoder--1384 -- Genius ACM (倍增 归并)
题目链接 1384 -- Genius ACM 给定一个整数 m,对于任意一个整数集合 S,定义“校验值”如下:从集合 S 中取出 m 对数(即 2*M 个数,不能重复使用集合中的数,如果 S 中的整 ...
- CH0601 Genius ACM【倍增】【归并排序】
0601 Genius ACM 0x00「基本算法」例题 描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数 ...
- Contest Hunter 0601 Genius ACM
Genius ACM Advanced CPU Manufacturer (ACM) is one of the best CPU manufacturer in the world. Every d ...
- ACM-ICPC Beijing 2016 Genius ACM(倍增+二分)
描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 M 对,则取到不能取为止),使 ...
- hihoCoder#1384 : Genius ACM
对于一个固定的区间$[l,r]$,显然只要将里面的数字从小到大排序后将最小的$m$个和最大的$m$个配对即可. 如果固定左端点,那么随着右端点的右移,$SPD$值单调不降,所以尽量把右端点往右移,贪心 ...
- Genius ACM
题解: 发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算 比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$ 没错暴力的最差复杂度是$n^2*logn$的 发现长度与次 ...
- [hihocoder #1384] Genius ACM 解题报告(倍增)
题目链接:http://hihocoder.com/problemset/problem/1384 题目大意: 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M ...
- hihocoder1384/CH0601 Genius ACM[贪心+倍增+归并排序]
提交地址. 关于lyd给的倍增方法,即从当前枚举向后的$2^k$长度($k$从$1$开始),如果可行就将$k$加一以扩大范围,不可行时将范围不断减半直至$0$. 举个例子,假设当下在1,目标答案是13 ...
- $CH0601\ Genius\ ACM$ 倍增优化DP
ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...
随机推荐
- CLP(FD)有限域上的约束逻辑式编程
译自http://www.pathwayslms.com/swipltuts/clpfd/clpfd.html#_simple_constraints,SWI-Prolog官网所推荐的进阶教程.目前还 ...
- 关于对象的行为、数组、继承和类的高级概念(Java)
1.对象的行为: (1)方法调用栈:所有的方法调用都维护在一个称为调用栈的结构中. 第一个被调用的方法就是main(),该方法是Jvm调用的,因此main()方法总 ...
- VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类
https://blog.csdn.net/weixin_40539125/article/details/81430801 打开VS2015 ,新建VS win32工程,前面步骤很简单,不再阐述 下 ...
- matlab中imfilter、conv2、imfilter2用法及区别
来源 :https://blog.csdn.net/u013066730/article/details/56665308(比较详细) https://blog.csdn.net/yuanhuilin ...
- C/C++ 条件编译
条件编译就是指有条件的编译,即根据条件去编译代码,在编译阶段时就对代码做出取舍,有的编译,有的不编译,这样比写成一个个判断函数更有效率,比如工程代码大部分的地方都类似,只有个别语句因为使用的硬件版本不 ...
- vue3.x版本新建项目相关知识和注意事项
前言你前提应该懂下面基础知识:下载node.js 下好后自带npm 命令 终端查看命令 npm -v 即可看到安装版本安装淘宝镜像:npm install -g cnpm --registry=htt ...
- Linux操作系统(第二版)(RHEL 8/CentOS 8)——勘误表
Linux操作系统(第二版)(RHEL 8/CentOS 8)--勘误表 http://www.tup.tsinghua.edu.cn/booksCenter/book_08172501.html 本 ...
- ubuntu19.10如何添加开机启动项
$sudo vi /lib/systemd/system/rc-local.service内容如下[Unit]Description=/etc/rc.local CompatibilityDocume ...
- vim插件配置
OS:kali linux tool:vim 上图: 0x00 需要用到的插件及其下载地址 左边的一栏显示文件目录结构的用到的插件为 NERDTree 下载地址:https://github.com/ ...
- docker的常用操作之三:网络配置
一, docker安装后容器使用哪些网络类型? 在宿主机执行如下命令: [root@localhost liuhongdi]# docker network ls NETWORK ID NAME DR ...