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

目录

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. input select 值得绑定与获取

    <div style="margin-top:100px"> <!--Input 值得绑定--> <div id="app20"& ...

  2. python bs4解析网页时 bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to inst(转)

    Python小白,学习时候用到bs4解析网站,报错 bs4.FeatureNotFound: Couldn't find a tree builder with the features you re ...

  3. CSS:CSS 尺寸 (Dimension)

    ylbtech-CSS:CSS 尺寸 (Dimension) 1.返回顶部 1. CSS 尺寸 (Dimension) CSS 尺寸 (Dimension) 属性允许你控制元素的高度和宽度.同样,它允 ...

  4. Awesome Adb——一份超全超详细的 ADB 用法大全

    https://github.com/mzlogin/awesome-adb https://www.cnblogs.com/bravesnail/articles/5850335.html     ...

  5. 9、TestNG介绍与安装

    介绍 TestNG是一个受JUnit和NUnit启发的测试框架,但引入了一些新功能,使其更加强大和易于使用,例如: 注释. 在任意大的线程池中运行你的测试,这些线程池有各种可用的策略(所有方法在他们自 ...

  6. Intel Pin基础

    参考:http://software.intel.com/sites/landingpage/pintool/docs/62732/Pin/html/ http://blog.nruns.com/bl ...

  7. ALSA 更改默认声卡

    用 aplay -l 看一下各声卡的配置信息 创建 /etc/asound.conf,根据 aplay -l  的输入,选择需要的声卡信息,按如下格式添入,即可更改默认声卡 defaults.pcm. ...

  8. Netty 源码分析——ChannelPipeline

    Netty 源码分析--ChannelPipeline 通过前面的两章我们分析了客户端和服务端的流程代码,其中在初始化 Channel 的时候一定会看到一个 ChannelPipeline.所以在 N ...

  9. JUC源码分析-集合篇(七)PriorityBlockingQueue

    JUC源码分析-集合篇(七)PriorityBlockingQueue PriorityBlockingQueue 是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现. P ...

  10. Neo4j 小调研

    一. 概况: 在图计算中,基本的数据结构表达式是:G= ( V,E ),V=vertex( 节点 ),E=edge(边) .图数据库中数据模型主要以节点和关系(边)来体现,也可以处理键值对.数据具有如 ...