hihocoeder1384
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的更多相关文章
随机推荐
- get请求url中带有中文参数出现乱码情况
在项目中经常会遇到中文传参数,在后台接收到乱码问题.那么在遇到这种情况下我们应该怎么进行处理让我们传到后台接收到的参数不是乱码是我们想要接收的到的,下面就是我的一些认识和理解. get请求url中带有 ...
- Leetcode771.Jewels and Stones宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符都是字母 ...
- Python2 生成器 简介
1. A generator: provide a kind of function that can return an intermediate result ("the next va ...
- 【JZOJ4888】【NOIP2016提高A组集训第14场11.12】最近公共祖先
题目描述 YJC最近在学习树的有关知识.今天,他遇到了这么一个概念:最近公共祖先.对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. ...
- jQuery,javascript获得网页的高度和宽度$(document).height / $(window).height
一.javascript 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: documen ...
- docker安装 2016-11-06 19:14 299人阅读 评论(31) 收藏
Docker支持运行在以下CentOS版本: CentOS 7.X 安装在二进制兼容的EL7版本如 Scientific Linux也是可能成功的,但是Docker 没有测试过并且不官方支持. 此文带 ...
- 复杂SQL示例 (排行榜需求)
公司项目要求做出排行榜,根据六组数据依次排行,关联多表,SQL记录下来方便日后查看 " ?><!DOCTYPE mapper PUBLIC "-//mybatis.or ...
- NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防
NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...
- vue-router2.0的用法
随着vue越来越火,而vue-router却是一个项目不可或缺的,所以在这里结合实例总结一下router的用法,也是给自己的一个总结. 1.首先第一步当然是安装vue-router依赖,当然也可直接s ...
- php第三方登录(微博登录,仿照慕课网)
https://www.cnblogs.com/haoyu521/p/5606931.html 1:开发之前,请大家先自行熟悉一下OAuth协议原理. 2:我们开发需要具备一个外网可访问的线上域名,如 ...