(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

目录

HDU6040:传送门

 \(m(m\leq 100)\)次查询长度为\(n(n \leq 1e7)\)区间的第k大。

思路

  • 利用快排的partation思想求解,但是要注意剪枝
  • 就是标记一下被确定好位置的地方
  • 然后这个题还可以用\(stl\)的\(nth\_element\)水过
  • \(nth\_element\)我没有剪枝就是暴力然后抠常数水过去了哈哈

AC代码:

partation思想

#pragma comment(linker,"/STACK:102400000,102400000")
#include <bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const int N = 1e7 + 7;
const int MX = 2e6 + 7;
int n, m;
unsigned x, y, z,ar[N],ans[N];
int br[N], cr[N];
inline unsigned rng61(){
unsigned t;
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}
int vis[N];
void qs(int l,int r,int k){
if(l>=r)return;
int a=l,b=r;
while(a<b){
while(a<b&&ar[b]>=ar[l])--b;
while(a<b&&ar[a]<=ar[l])++a;
swap(ar[a],ar[b]);
}
swap(ar[a],ar[l]);
vis[a]=1;
if(a==k)return;
if(a<k)qs(a+1,r,k);
else qs(l,a-1,k);
}
int main(){
int tim,tc=0;
while(~scanf("%d%d%u%u%u",&n,&m,&x,&y,&z)){
for(int i=0;i<n;++i){
ar[i]=rng61();
vis[i]=0;
}
for(int i=0;i<m;++i){
scanf("%d",&br[i]);
cr[i]=br[i];
}
sort(cr,cr+m);
int k = unique(cr,cr+m)-cr,last=n-1;
for(int i=k-1;i>=0;--i){
int l=cr[i],r=cr[i];
while(l>=0&&vis[l]==0)--l;
while(r<n&&vis[r]==0)++r;
++l;--r;
qs(l,r,cr[i]);
ans[cr[i]]=ar[cr[i]];
}
printf("Case #%d:", ++tc);
for(int i=0;i<m;++i){
printf(" %u", ans[br[i]]);
}
printf("\n");
}
return 0;
}

$nth\_element$

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e7 + 7;
int n, m;
unsigned x, y, z,ar[N],ans[N];
int br[N], cr[N];
inline unsigned rng61(){
unsigned t;
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}
int main(){
int tim,tc=0;
while(~scanf("%d%d%u%u%u",&n,&m,&x,&y,&z)){
for(int i=0;i<n;++i){
ar[i]=rng61();
}
for(int i=0;i<m;++i){
scanf("%d",&br[i]);
cr[i]=br[i];
}
sort(cr,cr+m);
int k = unique(cr,cr+m)-cr;
for(int i=k-1;i>=0;--i){
nth_element(ar,ar+cr[i],ar+n);
ans[cr[i]]=ar[cr[i]];
}
printf("Case #%d:", ++tc);
for(int i=0;i<m;++i){
printf(" %u", ans[br[i]]);
}
printf("\n");
}
return 0;
}

####CSU2078:[传送门](http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2078)

感觉被针对了,就是过不去~~

O(n)线性时间求解第k大-HDU6040-CSU2078的更多相关文章

  1. O(n)线性时间找第K大,中位数

    运用快速排序的思想,可以达到线性时间找到一串数的第K大 #include<cstdio> #define F(i,a,b) for(int i=a;i<=b;i++) ],n; vo ...

  2. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  3. 算法复习_线性时间求解Majority Vote Algorithm问题

    题目来源于Leecode上的Majority Element问题 Majority Element:在一个序列中出现了至少n/2的下界次 使用排序算法取中位数则需要Nlogn http://www.c ...

  4. HDU2639[背包第K大]

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=2639] 题意:求第k大背包. 题解:利用二路归并的思想,求解第K大的值. #include<bi ...

  5. 线性时间O(n)内求数组中第k大小的数

    --本文为博主原创,转载请注明出处 因为最近做的WSN(wireless sensor network)实验要求用3个传感器节点接受2000个包的数据并算出一些统计量,其中就有算出中位数这么一个要求, ...

  6. 【线性基】51nod1312 最大异或和&LOJ114 k大异或和

    1312 最大异或和 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题   有一个正整数数组S,S中有N个元素,这些元素分别是S[0] ...

  7. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...

  8. LOJ.114.K大异或和(线性基)

    题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...

  9. 利用划分树求解整数区间内第K大的值

    如何快速求出(在log2n的时间复杂度内)整数区间[x,y]中第k大的值(x<=k<=y)? 其实我刚开始想的是用快排来查找,但是其实这样是不行的,因为会破坏原序列,就算另外一个数组来存储 ...

随机推荐

  1. 【dart学习】-- Dart之元数据

    一,概述 元数据概述  元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置.历 ...

  2. centos7下命令行配置nginx

    本教程中的步骤要求用户拥有root权限 第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二 ...

  3. (转)openfire插件开发(三)通过http方式向openfire客户端发信息

    转:http://blog.csdn.net/hzaccp3/article/details/19964655 需求:  通过http方式,向openfire客户端发信息(非XMPP协议)openfi ...

  4. 配置ssh连接会话复用免密码登录

    我们经常使用ssh连接远程主机,为了方便,避免每次登录输入密码,通常使用密钥登录.如果没有设置密钥, 则需要使用密码登录了,若每次都输入密码则十分繁琐.我们可以设置ssh连接会话复用,则登录成功后,会 ...

  5. JDK的下载及安装

    JDK下载及安装 JDK的下载 官网下载 点击进入之后,显示的是当前版本最新的,点击downloads,选择适合自己电脑的版本下载 下载历史版本要一直往下拉,找到如图: 点击之后会显示以往的版本 环境 ...

  6. Git 学习第一天

    本文是根据廖雪峰老师的git教程记录的学习笔记,特此说明,原教程链接https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...

  7. Day 21 python :面向对象 类的相关内置函数 /单例模式 /描述符

    1.isinstance(obj,cls) 检查obj是否是类cls的对象: 备注:用isinstance 的时候,产生实例后,会显示实例既是父类的实例,也是子类的实例 class Mom: gend ...

  8. Python翻译

    translator.py # -*- coding: utf-8 -*- # author: inspurer(月小水长) # pc_type lenovo # create_time: 2019/ ...

  9. 「SNOI2019」通信 分治优化费用流建图

    题意: n 个排成一列的哨站要进行通信.第 i 个哨站的频段为 ai. 每个哨站 ii 需要选择以下二者之一: 1.直接连接到控制中心,代价为 W:2.连接到前面的某个哨站 j(j<i),代价为 ...

  10. 利用纯css写三角形,弧度箭头,吃豆人,气泡。放大镜,标签的源码

    1. 向上三角形