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
二分+倍增 题目 题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值--进行做差平方取和 所以在加入一个新的数时,校验值是不会下降的 那么可以发现,校验值是单调递增的,所以可以用二分 ...
随机推荐
- 移动硬盘和u盘的区别
移动硬盘和U盘都属于便携性存储器,用于计算机之间的数据交换.但移动硬盘和U盘的区别还是非常大的,包括内部构造.容量以及整体外观上. 移动硬盘又分为机械移动硬盘和固态移动硬盘两种,主要区别在于内置的存储 ...
- EF Codefirst入门之创建数据库
实验环境是VS 2015.MSSQL Server 2008.windows 10 一.创建项目 通过VS创建一个MVC5项目EntityFrameworkExtension 二.安装Entity F ...
- 使用sudo而无需输入密码的设置
在linux上,root用户是老大,什么事都能做.但是,很多时候由于安全等各种原因,我们不希望把root用户开放给大家,但是又希望其他的用户可以有root的权限,所以就有了sudo用户.而执行sudo ...
- 范围for语句
C++11 新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素.范围for语句(range for statement)的语法形式是: for (declaration : ...
- Spring MVC的核心控制器DispatcherServlet的作用
关于Spring MVC的核心控制器DispatcherServlet的作用,以下说法错误的是( )? 它负责接收HTTP请求 加载配置文件 实现业务操作 初始化上下应用对象ApplicationC ...
- 使用Fiddler进行手机端抓包
1.手机和电脑在同一局域网 2.在电脑上查看ip地址 3.如果是需要抓取https,则需要在浏览器中输入http://xxx.xxx.x.xxx:8888(第二部查到的ip地址 + Fiddler 的 ...
- InnoDB 与 MYISAM的区别和联系
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
- HBase的replication原理及部署
一.hbase replication原理 hbase 的复制方式是 master-push 方式,即主集群推的方式,主要是因为每个rs都有自己的WAL. 一个master集群可以复制给多个从集群,复 ...
- 数据库-mysql-DDL-表记录操作
- Java jvisualvm 远程监控tomcatt
第一步 在远程tomcat 的bin目录下的start.sh 文件中添加一些内容(添加在exec "$PRGDIR"/"$EXECUTABLE" start & ...