Week4 作业C TT的神秘礼物 二分答案 尺取

2023-10-25 10:50

本文主要是介绍Week4 作业C TT的神秘礼物 二分答案 尺取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:

有n个数的数组cat(3<=n<=10^5,cat[i]<=10^9),构造一个新的数组ans,ans[]=abs(cat[i]-cat[j])(i!=j),试求出这个新数组的中位数,中位数为排序后pos=(len+1)/2位置的数。

题目分析:

最直接的方法是将ans数组求出来然后排序,复杂度为O(n^2),无法接受。

二分枚举答案,共有logn种答案。对于每一种答案p,求出p在数组ans中的最高名次f1(p)、最低名次f2(p)。若f1(p)<pos,说明答案p太小,转而二分枚举后半部分的答案;若f2(p)>pos,说明答案p太大,转而二分枚举前半部分的答案;否则,p为中位数。

只需讨论求最高名次f1(p),最低名次f2(p)=f1(p-1)+1。为了去掉绝对值,对cat数组排序,则可以通过cat[j]-cat[i](i<j)求得ans中一半的数。所有满足cat[j]-cat[i]<=p的(i,j)数对的个数的2倍即为f1(p)。移项可得cat[j]<=cat[i]+p,cat有序,依然可以二分枚举。对于n个i,二分枚举j,求出满足条件的(i,j)数对的个数。复杂度为O(nlogn),整体的复杂度为O(nlog^2n)

如果O(nlog^2n)TLE,可以利用尺取法降成O(nlogn)。当求出i=0时满足条件的j的最大位置cur时,i向后移动一个位置,cur向后移动的位置是有限的,并且i移动n个位置的过程,cur最多只移动n个位置。尺取法使用两个指针,只遍历一遍,求名次的过程复杂度为O(n),整体过程为O(nlogn)

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
const int maxx=1e9;
int n;
int cat[maxn];
int findLast(int x){//找到<=x的最右端位置 int l=0,r=n-1,ans=-1;while(l<=r){int mid=(l+r)>>1;if(cat[mid]<=x){ans=mid;l=mid+1;}else r=mid-1;}return ans;
}
//O(n)
int funcMax(int x)//求最高名次 从1开始 
{int ans=0;int cur=findLast(cat[0]+x);//findLast指针 int num=cur-0;ans+=num*2;for(int i=1;i<n;i++){ if(cur!=n-1){while(cur<=n-1 && cat[cur]<=cat[i]+x) cur++;cur--;}num=cur-i;ans+=num*2;}return ans; 
}
//O(nlogn)
int funcMax2(int x)//求最高名次 从1开始 
{int ans=0;int tmp=0;for(int i=0;i<n;i++){tmp=findLast(cat[i]+x)-i;tmp*=2;//交换i,j ans+=tmp;}return ans; 
}
int funcMin(int x)//求最低名次 从1开始
{return funcMax(x-1)+1;
} 
int solve()
{int len=n*n-n;int l=0 , r=maxx , ans=-1;while(l<=r){int mid=(l+r)>>1;int left=funcMin(mid) , right=funcMax(mid);if(right>=(len+1)/2 && left<=(len+1)/2){ans=mid ; break;} else if(right<(len+1)/2) l=mid+1;else if(left>(len+1)/2) r=mid-1;}  return ans;
}
int main()
{while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++) scanf("%d",&cat[i]);sort(cat,cat+n);printf("%d\n",solve());} return 0;
}

 

这篇关于Week4 作业C TT的神秘礼物 二分答案 尺取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/282054

相关文章

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

【网络安全的神秘世界】搭建dvwa靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 下载DVWA https://github.com/digininja/DVWA/blob/master/README.zh.md 安装DVWA 安装phpstudy https://editor.csdn.net/md/?articleId=1399043

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

学生作业管理系统设计文档

一、项目概述 本系统设计文档旨在为学生作业管理系统提供一个全面的设计方案。该系统旨在提高作业管理的效率,减轻教师的工作负担,并为学生提供一个清晰、便捷的作业提交和查看平台。系统需具备作业发布、作业提交、作业批改、成绩查看等基本功能,同时保证系统的稳定性、可扩展性和易用性。 二、系统功能性需求 1.用户管理 用户注册与登录 用户角色管理(教师、学生、管理员) 用户信息修改与查看 2.作业管

华为面试题及答案——机器学习(一)

(1). 线性回归普通最小二乘法运用的经典基本假设有哪些? 线性回归中,普通最小二乘法(Ordinary Least Squares, OLS)是一种常用的估计方法。 线性关系假设: 假设自变量(X)与因变量(Y)之间存在线性关系。即,模型可以表示为 Y=β0+β1X1+β2X2+...+βnXn+ϵY = \beta_0 + \beta_1X_1 + \beta_2X_2 + ... +

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re

【网络安全的神秘世界】SQL注入漏洞

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 本章知识使用的靶场:DVWA 一、漏洞简介 SQL:结构化查询语言,是一种特殊的编程语言,用于数据库中的标准数据查询语言 SQL注入:简而言之就是,攻击者通过系统正常的输入数据的功能,输入恶意数据,而系统又未做任何校验或校验不严格,直接信任了用户输入,使得

转:40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

Spark on YARN client模式作业运行全过程分析

在前篇文章中我介绍了Spark on YARN集群模式(yarn-cluster)作业从提交到运行整个过程的情况(详情见《Spark on YARN集群模式作业运行全过程分析》),我们知道Spark on yarn有两种模式:yarn-cluster和yarn-client。这两种模式作业虽然都是在yarn上面运行,但是其中的运行方式很不一样,今天我就来谈谈Spark on YARN