二分+倍增

题目

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

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

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

所以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. 如何使用微软提供的TCHAR.H头文件?

    转载:https://www.cnblogs.com/flyingspark/archive/2012/03/16/2399788.html 如何使用微软提供的TCHAR.H头文件? 如果你现在写的代 ...

  2. 可能是东半球第二好用的软件工具全部在这里(update in 2020.10.09)

    1. 产品经理工具种草 浏览器:Google Chrome 网络浏览器 原型绘制软件:墨刀- 在线产品原型设计与协作平台(https://modao.cc/).摹客mockplus - 摹客,让设计和 ...

  3. JS-YAML -YAML 1.2 JavaScript解析器/编写器

    下载 JS-YAML -YAML 1.2 JavaScript解析器/编写器JS-YAML -YAML 1.2 JavaScript解析器/编写器 在线演示 这是YAML的实现,YAML是一种对人友好 ...

  4. 安装haproxy

    安装依赖 yum install -y gcc pcre pcre-devel openssl openssl-devel 创建依赖账号,并禁止账号登录 useradd -M -s /sbin/nol ...

  5. volatile、ThreadLocal的使用场景和原理

    并发编程中的三个概念 原子性 一个或多个操作.要么全部执行完成并且执行过程不会被打断,要么不执行.最常见的例子:i++/i--操作.不是原子性操作,如果不做好同步性就容易造成线程安全问题. 可见性 多 ...

  6. 用网桥和veth实现容器的桥接模式

    原理图如下 具体命令先不写了,有时间再写,主要还是用的上一篇说的知识.

  7. 第一期chrome浏览器的小技巧------《提高搜索效率》

    !!! 这次的技巧是:利用chrome提供的设置 提高你的搜索效率 !!! 我们经常遇到问题,搜索的时候很不方便 比如你在百度上搜索一个东西的时候正好没有搜到,那么你想找到这个东西的话,很明显要到其他 ...

  8. go xpath

    package main import ( "fmt" "github.com/antchfx/htmlquery" "net/http" ...

  9. linux(centos8):安装分布式事务服务seata(file单机模式,seata 1.3.0/centos 8.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件,开源的分布式事务解决方案. 前身是阿里的 ...

  10. go cap和len区别

    首先要搞清楚容量和长度的区别: 容量是指底层数组的大小,长度指可以使用的大小 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否则,go 会新申请一个底层 ...