二分+倍增

题目

题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值……进行做差平方取和

所以在加入一个新的数时,校验值是不会下降的

那么可以发现,校验值是单调递增的,所以可以用二分对每一个固定的左段点找到满足条件的最大的右端点

所以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的更多相关文章

  1. hihocoder--1384 -- Genius ACM (倍增 归并)

    题目链接 1384 -- Genius ACM 给定一个整数 m,对于任意一个整数集合 S,定义“校验值”如下:从集合 S 中取出 m 对数(即 2*M 个数,不能重复使用集合中的数,如果 S 中的整 ...

  2. CH0601 Genius ACM【倍增】【归并排序】

    0601 Genius ACM 0x00「基本算法」例题 描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数 ...

  3. Contest Hunter 0601 Genius ACM

    Genius ACM Advanced CPU Manufacturer (ACM) is one of the best CPU manufacturer in the world. Every d ...

  4. ACM-ICPC Beijing 2016 Genius ACM(倍增+二分)

    描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 M 对,则取到不能取为止),使 ...

  5. hihoCoder#1384 : Genius ACM

    对于一个固定的区间$[l,r]$,显然只要将里面的数字从小到大排序后将最小的$m$个和最大的$m$个配对即可. 如果固定左端点,那么随着右端点的右移,$SPD$值单调不降,所以尽量把右端点往右移,贪心 ...

  6. Genius ACM

    题解: 发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算 比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$ 没错暴力的最差复杂度是$n^2*logn$的 发现长度与次 ...

  7. [hihocoder #1384] Genius ACM 解题报告(倍增)

    题目链接:http://hihocoder.com/problemset/problem/1384 题目大意: 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M ...

  8. hihocoder1384/CH0601 Genius ACM[贪心+倍增+归并排序]

    提交地址. 关于lyd给的倍增方法,即从当前枚举向后的$2^k$长度($k$从$1$开始),如果可行就将$k$加一以扩大范围,不可行时将范围不断减半直至$0$. 举个例子,假设当下在1,目标答案是13 ...

  9. $CH0601\ Genius\ ACM$ 倍增优化DP

    ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...

随机推荐

  1. Layman PHP+JavaScript 实现图片无刷新上传

    html文件代码 <!-- ajax文件上传开始 --> <script type="text/javascript" src="/imageuploa ...

  2. DIV垂直滚动效果源码

    <div id="demo" style="width: 300; overflow: hidden; line-height:24px; height: 100p ...

  3. c++ 中预编译头文件名 pch.h

    转载:https://www.it-swarm.asia/zh/c++/%e6%88%91%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8includepchh%e2%80%9 ...

  4. [BJWC 2011]元素

    题目大意: 你有n个二元组(x,y),要求从中任取几个,使得x的值亦或起来不为0,且y之和最大. 题解: 显然是以x来构造线性基的,然而加入元素的个数是有限制的,那当然就是大的先来喽,排个序就OK啦! ...

  5. 【转载】可能是世界上最牛逼的网站统计程序——Matomo

    大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...

  6. LCA树上倍增求法

    1.LCA LCA就是最近公共祖先(Least common ancestor),x,y的LCA记为z=LCA(x,y),满足z是x,y的公共祖先中深度最大的那一个(即离他们最近的那一个)qwq 2. ...

  7. Redis Hashes 数据类型简述

    Redis Hashes 是我们日常使用中比较高频的 Redis 数据类型,内部使用 Redis 字典结构存储,底层基于哈希表结构实现. 下面从哈希表节点,哈下表结构,Redis 字典,Redis 字 ...

  8. BGP - 不同 AS 间运行的协议

    在之前介绍的网络场景中,ERGRP,OPSF,RIP 等都是运行在单独一个 AS(自治系统之间).这些协议统称为 IGP - 内部网关协议 ,目的主要是为自治系统内发现邻居和计算路由,从而找到合适的路 ...

  9. Cypress系列(69)- route() 命令详解

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 管理控制整个网络请求 重要注意事项 ...

  10. 学会这三个命令,你就不再是git只会用三板斧的菜鸟了

    前言 在之前的文章当中我们介绍了最基本的git add.git commit和git push的用法以及基本原理,还介绍了gitignore文件的设置方法,从而让我们可以使用git add .来添加我 ...