Genius ACM
题解:
发现匹配一定会选最大和最小匹配,确定左右端点之后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的更多相关文章
- 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$值单调不降,所以尽量把右端点往右移,贪心 ...
- [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 首先是校验值的求法: 要使得'每对数 ...
- XJOI 7191 Genius ACM
二分+倍增 题目 题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值--进行做差平方取和 所以在加入一个新的数时,校验值是不会下降的 那么可以发现,校验值是单调递增的,所以可以用二分 ...
随机推荐
- Python3学习笔记28-HtmlTestRunner
HtmlTestRunner是unittest模块下的一个拓展,用来生成测试报告.原生的可以自己找下下载地址,原生的看着比较丑.这次使用的是经过一些大佬优化之后的.具体GitHub地址:https:/ ...
- SharePoint 2016 vs部署报错:无法加载功能xxx未能加载文件或程序集xxx或它的某一个依赖项。系统找不到指定的文件
环境描述: SharePoint 2016 单服务器场模式 开发工具:VS2017,项目类型(功能):计时器. 问题描述: 在用vs直接部署时,报错如下: 部署步骤"激活功能"中出 ...
- Python学习前期准备---第九天
一.Linux基础 - 计算机以及日后我们开发的程序防止的服务器的简单操作 二.Python开发 http://www.cnblogs.com/wupeiqi/articles/5433893.htm ...
- libunistring-0.9.9
Introduction to libunistring Text files are nowadays usually encoded in Unicode, and may consist of ...
- 微信小程序-聊天列表-角标
<div class="list-body" bindtap='openChat' data-Obj='{{oitem}}'> <!-- 头像 --> &l ...
- Docker 导出 & 导入
Docker 容器因为它的快速部署被深受喜爱.本文记录 Docker 容器的导出与导入,分别用到 Docker 的 export 和 import 命令. 1.查看正在运行的容器: [root@loc ...
- 最新版Kali Linux虚拟机安装Open-vm-tools替代VMware tools
自从Kali 2.0发布之后,会经常遇到安装vmware tools无法成功,或者提示安装成功了但是仍旧无法进行文件拖拽.复制和剪切的问题. 今天给新电脑装系统,重新下载了最新版,Kali 2017. ...
- 【原创】大数据基础之Hadoop(2)hdfs和yarn最简绿色部署
环境:3结点集群 192.168.0.1192.168.0.2192.168.0.3 1 配置root用户服务期间免密登录 参考:https://www.cnblogs.com/barneywill/ ...
- MySQL查询语句练习题,测试基本够用了
Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...
- Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题
本文涉及的代码案例可以在下方的链接中找到,如果对你有帮助,请给个Star(#^.^#) https://github.com/CodeTillDoom/StaggeredRcl 问题分析 这段时间业务 ...