题解:

发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算

比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$

没错暴力的最差复杂度是$n^2*logn$的

发现长度与次数相关

二分改成倍增 $n(logn)^2$

然后大概常数好就过了吧

倍增的时候我们可以把排序看成一段有序的+一段无序的

可以把无序的先排序再和有序的归并

时间复杂度nlogn

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define ll long long
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const int N=6e5;
int a[N],b[N],n,m,c[N],d[N],e[N],len;
ll k;
IL bool check(rint x,rint y)
{
rint len=y-x+;
rep(i,x,y) b[i-x+]=a[i];
sort(b+,b+len+);
rint tmp=len/;
ll ans=;
rep(i,,m)
{
if (i>tmp) break;
ans+=1ll*(b[i]-b[len-i+])*(b[i]-b[len-i+]);
}
if (ans<=k) return(); else return();
}
IL bool check(rint x,rint y,rint h2,rint t2)
{
rint len2=t2-h2+;
rep(i,h2,t2) c[i-h2+]=a[i];
sort(c+,c+len2+);
int h1=,t1=len; h2=,t2=len2;
int cnt=;
while (h2<=t2&&h1<=t1)
{
if (b[h1]<c[h2]) d[++cnt]=b[h1],h1++;
else d[++cnt]=c[h2],h2++;
}
while (h1<=t1) d[++cnt]=b[h1],h1++;
while (h2<=t2) d[++cnt]=c[h2],h2++;
rep(i,,len) e[i]=b[i];
rep(i,,cnt) b[i]=d[i];
rint tmp2=len; len=cnt;
rint tmp=len/;
ll ans=;
rep(i,,m)
{
if (i>tmp) break;
ans+=1ll*(b[i]-b[len-i+])*(b[i]-b[len-i+]);
}
if (ans<=k) return(); else
{
len=tmp2;
rep(i,,len) b[i]=e[i];
return();
}
}
IL int js(register int x)
{
register int y=x;
register int i=;
register int lst=x-;
while (i>=)
{
for (i=;i<=;i++)
{
if (!check(y,x+(<<i)-,lst+,x+(<<i)-)) break;
lst=x+(<<i)-;
}
i--;
x=x+(<<i)-;
i--;
if (x>n) break;
}
return x;
}
int main()
{
freopen("geniusacm.in","r",stdin);
freopen("geniusacm.out","w",stdout);
int T;
read(T);
rep(tt,,T)
{
read(n); read(m); read(k);
rep(i,,n) read(a[i]);
int now=,cnt=;
while (now<=n)
{
len=;
now=js(now)+;
cnt++;
}
cout<<cnt<<endl;
}
return ;
}

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. [hihocoder #1384] Genius ACM 解题报告(倍增)

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

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

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

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

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

  9. XJOI 7191 Genius ACM

    二分+倍增 题目 题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值--进行做差平方取和 所以在加入一个新的数时,校验值是不会下降的 那么可以发现,校验值是单调递增的,所以可以用二分 ...

随机推荐

  1. Python3学习笔记28-HtmlTestRunner

    HtmlTestRunner是unittest模块下的一个拓展,用来生成测试报告.原生的可以自己找下下载地址,原生的看着比较丑.这次使用的是经过一些大佬优化之后的.具体GitHub地址:https:/ ...

  2. SharePoint 2016 vs部署报错:无法加载功能xxx未能加载文件或程序集xxx或它的某一个依赖项。系统找不到指定的文件

    环境描述: SharePoint 2016 单服务器场模式 开发工具:VS2017,项目类型(功能):计时器. 问题描述: 在用vs直接部署时,报错如下: 部署步骤"激活功能"中出 ...

  3. Python学习前期准备---第九天

    一.Linux基础 - 计算机以及日后我们开发的程序防止的服务器的简单操作 二.Python开发 http://www.cnblogs.com/wupeiqi/articles/5433893.htm ...

  4. libunistring-0.9.9

    Introduction to libunistring Text files are nowadays usually encoded in Unicode, and may consist of ...

  5. 微信小程序-聊天列表-角标

    <div class="list-body" bindtap='openChat' data-Obj='{{oitem}}'> <!-- 头像 --> &l ...

  6. Docker 导出 & 导入

    Docker 容器因为它的快速部署被深受喜爱.本文记录 Docker 容器的导出与导入,分别用到 Docker 的 export 和 import 命令. 1.查看正在运行的容器: [root@loc ...

  7. 最新版Kali Linux虚拟机安装Open-vm-tools替代VMware tools

    自从Kali 2.0发布之后,会经常遇到安装vmware tools无法成功,或者提示安装成功了但是仍旧无法进行文件拖拽.复制和剪切的问题. 今天给新电脑装系统,重新下载了最新版,Kali 2017. ...

  8. 【原创】大数据基础之Hadoop(2)hdfs和yarn最简绿色部署

    环境:3结点集群 192.168.0.1192.168.0.2192.168.0.3 1 配置root用户服务期间免密登录 参考:https://www.cnblogs.com/barneywill/ ...

  9. MySQL查询语句练习题,测试基本够用了

    Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...

  10. Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题

    本文涉及的代码案例可以在下方的链接中找到,如果对你有帮助,请给个Star(#^.^#) https://github.com/CodeTillDoom/StaggeredRcl 问题分析 这段时间业务 ...