hihocoeder1384

算法竞赛进阶指南上的题目

我们肯定是吧最大值和最小值匹配,次大值和次小值匹配以此类推

首先,类似于区间覆盖的思想,我们对于一个\(L\),找到最大的满足条件的\(R\)

之后把\(R + 1\)作为下一个\(L\)继续这个操作

现在,问题转化成了我们如何寻找最大的\(R\)

一个比较明显的思路就是去二分,但是二分时间复杂度不对

因为如果每次只能前进一格,二分时间复杂度就变成了\(n^2\log{n}\)

考虑倍增的思想

我们对于每个\(L\)

初始设置\(R= L - 1,p = 1\)

之后求加上\([R + 1,R + p]\)时候合法

合法的话 \(p = p \times 2\)

否则 \(p = p / 2\)

每次暴力判断新加入的区间是否合法

可以证明这样时间复杂度

为\(n\log^2{n}\)

之后发现,对于新加进来的区间,我们只需要把它排序,然后和原有的区间进行归并即可

时间复杂度就变成了\(n\log n\)

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
#define min std::min
#define max std::max
const int N = 5e5 + 3;
int a[N];
int n,m;LL k;
std::vector <int> A,B,G;
inline LL read(){
LL v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
inline bool check(int l,int r){
B.clear(),G.clear();
for(int i = l;i <= r;++i) B.push_back(a[i]);
sort(B.begin(),B.end());
int now1 = 0;int now2 = 0;
while(now1 < A.size() && now2 < B.size()){
if(A[now1] < B[now2]) G.push_back(A[now1++]);
else G.push_back(B[now2++]);
}
while(now1 < A.size()) G.push_back(A[now1++]);
while(now2 < B.size()) G.push_back(B[now2++]);
LL res = 0;
now1 = 0,now2 = G.size() - 1;
for(int cnt = 0;cnt < m && now1 < now2;now1++,now2--,cnt++) res += 1ll * (G[now1] - G[now2]) * (G[now1] - G[now2]);
if(res <= k){
A = G;
return 1;
}
else return 0;
}
int main(){
// freopen("A.in","r",stdin);
// freopen("A1.out","w",stdout);
int T = read();
while(T--){
int ans = 0;
n = read(),m = read(),k = read();
for(int i = 1;i <= n;++i) a[i] = read();
int l = 1,r = 0;
while(l <= n){
int p = 1;
A.clear();
while(p){
int t = min(n,r + p);
if(check(r + 1,t)){
r = t;
if(t == n) break;
p <<= 1;
}
else p >>= 1;
}
l = r + 1;
ans++;
}
printf("%d\n",ans);
}
return 0;
}
/*
1
10 2 10
4 1 3 2 1 3 2 1 3 4 */

hihocoeder1384的更多相关文章

随机推荐

  1. WPF/Silverlight深度解决方案:(九)HLSL自定义渲染特效之完美攻略(下)

    原文:WPF/Silverlight深度解决方案:(九)HLSL自定义渲染特效之完美攻略(下) 本想只用两节来完成关于HLSL自定义渲染相关知识的讲解,鉴于最近非常的多的朋友对此相当感兴趣,想知道最多 ...

  2. iOS9新系统下App Store应用上传新指南

    http://www.cocoachina.com/appstore/20151010/13691.html 最近频繁收到小伙伴们的反馈,说经过前期学习已对ASO规则略有了解,但APP的提交审核是由技 ...

  3. 64位linux源码安装mysql

    一:下载mysql http://dev.mysql.com/downloads/mysql/中的Generally Available(GA) Releases标签页,在MySQL Communit ...

  4. Spring Security入门篇——标签sec:authorize的使用

    Security框架可以精确控制页面的一个按钮.链接,它在页面上权限的控制实际上是通过它提供的标签来做到的 Security共有三类标签authorize authentication accessc ...

  5. 文字渐变效果:图层中的mask属性

    http://www.cocoachina.com/ios/20150716/12571.html 前言 已经很久没写blog了,最近发生了太多事情,失去了生命中一位很重要的成员,使我不得不放下对技术 ...

  6. Java练习 SDUT-2272_Time

    Time Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description Digital clock use 4 digits to e ...

  7. python环境测试MySQLdb、DBUtil、sqlobject性能

    python环境测试MySQLdb.DBUtil.sqlobject性能 首先介绍下MySQLdb.DBUtil.sqlobject: (1)MySQLdb 是用于Python连接Mysql数据库的接 ...

  8. How to use AutoMapper

    http://docs.automapper.org/en/stable/Getting-started.html IMappingExpression<TSource, TDestinatio ...

  9. [C#] 如何分析stackoverflow等clr错误

    有时候由于无限递归调用等代码错误,w3wp.exe会报错退出,原因是clr.exe出错了. 这种错误比较难分析,因为C#代码抓不住StackOverflowException等异常. 处理方法是:生成 ...

  10. nn.moduleList 和Sequential由来、用法和实例 —— 写网络模型

    对于cnn前馈神经网络如果前馈一次写一个forward函数会有些麻烦,在此就有两种简化方式,ModuleList和Sequential.其中Sequential是一个特殊的module,它包含几个子M ...