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
二分+倍增 题目 题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值--进行做差平方取和 所以在加入一个新的数时,校验值是不会下降的 那么可以发现,校验值是单调递增的,所以可以用二分 ...
随机推荐
- VC获取操作系统位数
方法1,msdn 有相应的例子,代码贴出来给你看看 MSDN有相应Example! #include <windows.h> typedef BOOL (WINAPI *LPFN_ISWO ...
- 题解-AtCoder-agc006C Rabbit Exercise
Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...
- VS2017打包C#桌面应用
原文地址:https://blog.csdn.net/houheshuai/article/details/78518097 在要打包项目的解决方案 右键→添加→ 新建项目 后出现如下选择 如果没有V ...
- ORACLE IMPDP导入报表数据已存在
背景 搞了这么多年oracle,不论是开发和运维,自认为是都了解了,和dba差的只是熟练的问题,因为毕竟不是天天搞它.不过突然听说数据泵导入的功能,大吃一惊,好像有印象,以为是落后的,一查,竟然是先进 ...
- nginx 负载 问题
1 如果使用ip_hash,nginx必须为最前端负载均衡,如果大网环境部署,基本无法实现,内网还可以使用 2 如果不使用ip_hash,则要考虑session问题,可以使用memcached与tom ...
- 007_zkCli.sh
一. [zk: localhost:2181(CONNECTED) 1] rmr /zkTestPaths_92018-06-25 11:18:30,189 [myid:] - WARN [main- ...
- Qt图片显示
1.图片截取指定大小 void Setting_TabProduct::changeImageSize(int width,int height,QString imgFile) { QPixmap ...
- python学习第3天
03 int 十进制与二进制之间的转换04 bool 05 str python中凡是用引号引起来的都是字符串 1,存储相对少量的数据. 2,描述信息. 1,bool str int 三者之间的转换 ...
- Mysql 递归获取多重数组数据
多重数据 $data ,获取顶级下的所有下级id $data array:3 [▼ 0 => array:7 [▼ "id" => 1 "created_at ...
- Laravel-Excel 导入 Excel 文件----为什么只获取到最后一行数据?
### 今天使用了Laravel-Excel 到类文件,想做一个excel 文件到导入和导出,但是看了 官方到文档示例,自己做了一下,发现 只取到到最后一行到数据, 有点摸不着头脑! 网上找了一下, ...