【数据结构练习】 求区间第K大数的几种方法

c++求区间第k大数_区间第k大的几种解法 区间第K大问题,变化包括带修改和不带修改,强制在线和允许离线修改主要是单点修改,我们前面也只讨论这种情况。接下来我们从编程复杂度和时空复杂度来讨论几种做法。1.整体二分(编程复杂度:低-中,时间复杂度:优秀,空间复杂度:优秀)缺点:只能做离线优点:空间都是O(n)。常数小。带修改O(nlog2n),不带修改O(nlogn)。但是不带修改的情况,如果允许的话,个人认为加个树状数组写O(nlog2n)... 阅读详情

这类求数列上区间第K大数的题目非常非常多(当然题目要求通常是求区间第K小)。

比如HDOJ 2665,POJ 2104,SOJ 3147,SOJ 3010,SOJ 3102(只计算一次),POJ 2761(区间不包含)。

求解这个问题的方法也非常多,在这里对几种我认为比较常见的方法做一下总结,今后也会不断补充。

当然,几乎所有的高级数据结构都可以用来求区间第K大数,我也认为这是初学一个数据结构时的一个很好的练习。

高级数据结构是我的软肋之一,如果代码写的有什么不优越的地方,欢迎神犇指教 > < 。


1、快速划分

最简单的方法,当然就是用类似快排的方法做快速划分,

每次随机选取一个数作为“主元”,以“主元”为分界线把当前区间的数划分成两部分,并找出“主元”的精确位置,然后不断递归。

关于这个算法的讲解可以看MIT的《算法导论》公开课。

无奈我太蒟蒻,怎么都是TLE,大家姑且一看:

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;

const int MAXN=110000;
int a[MAXN],b[MAXN];
char s[2000000];

int quicksort(int p, int q)
{
    int k=p+((int)rand()%(q-p+1));
    swap(b[k],b[p]);
    int i=p;
    for(int j=p+1; j<=q; j++)
    {
        if(b[j]<b[p])
        {
            i++;
            swap(b[i],b[j]);
        }
    }
    swap(b[i],b[p]);
    return i-p+1;
}

int solve(int p, int q, int k)
{
    int tmp;
    while((tmp=quicksort(p,q))!=k)
    {
        if(tmp<k)
        {
            p+=tmp;
            k-=tmp;
        }
        else
        {
            q=p+tmp-1;
        }
    }
    return b[p+tmp-1];
}

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        while(m--)
        {
            int l,r,k;
            scanf("%d%d%d",&l,&r,&k);
            memcpy(b,a,n*sizeof(int));
            printf("%d\n",solve(l-1,r-1,k));
        }
    }
    return 0;
}

2、二叉堆

用一个容量为K的二叉堆,把当前区间的元素全部入堆,但是每次只保留这个堆中前K小的数,最后这个堆中的堆顶元素即为所求

这个算法肯定更加是TLE的,我相信即使手写堆也多半时过不了的,给大家写一段代码示意一下:

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;

const int MAXN=110000;
int a[MAXN];
priority_queue<int> q;

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        while(m--)
        {
            int l,r,k;
            scanf("%d%d%d",&l,&r,&k);
            l--;
            r--;
            while(!q.empty())
            {
                q.pop();
            }
            int cot=0;
            for(int i=l; i<=r; i++)
            {
                q.push(a[i]);
                cot++;
                if(cot>k)
                {
                    q.pop();
                    cot--;
                }
            }
            printf("%d\n",q.top());
        }
    }
    return 0;
}

3、树状数组

小伙伴们喜闻乐见的树状数组也可以用来求区间第K大数哦!

树状数组中的+-lowbit,实际上就是在“树”上实现了跳到父节点/子节点的操作。

由此可以二分地求出第K大数。

参考了clj的代码和一篇解题报告,这个是只能在固定区间求的。

当然想要在任意子区间求显然也不难,只要每次重新建树就可以了。

和上面一样,这个代码也是无论如何都过不了的 > < 。

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;

const int MAXP = 22;
const int MAXN = 2100000;

vector<int> hash;
int a[MAXN], tr[MAXN];
int m;

void add(int x)
{
    while(x <= m)
    {
        tr[x]++;
        x+=x&(-x);
    }
}

int solve(int k)
{
    int cnt = 0, ans = 0;
    for (int i = MAXP-1; i >= 0; i--)
    {
        ans += 1 << i;
        if (ans >= m || cnt + tr[ans] >= k)
        {
            ans -= 1 << i;
        }
        else
        {
            cnt += tr[ans];
        }
    }
    return ans + 1;
}

int main()
{
    int n,k;
    while(scanf("%d%d", &n, &k)==2)
    {
        hash.clear();
        memset(tr, 0, sizeof(tr));
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d", &a[i]);
            hash.push_back(a[i]);
        }
        sort(hash.begin(), hash.end());
        hash.erase(unique(hash.begin(), hash.end()), hash.end());
        m = hash.size();
        for(int i = 1; i <= n; i ++)
        {
            a[i] = lower_bound(hash.begin(), hash.end(), a[i]) - hash.begin();
            add(a[i]+1);
        }
        printf("%d\n", hash[solve(k)-1]);
    }
    return 0;
}

-------------------------------------------------------------------------下面介绍几种不TLE的----------------------------------------------------------------------------


4、划分树

划分树是一种线段树。

可以用来求区间第K大。

学划分树墙裂建议做一下HDOJ 4417,可以通过对代码稍加改动,由求区间第K大转化为求区间内小于某个值的数有多少个(不需二分哟)。

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;
const int MAXN=110000;
int tr[MAXN<<2];
int sorted[MAXN],toleft[20][MAXN],val[20][MAXN];

void build(int l, int r, int dep, int rt)
{
    if(l==r)
    {
        return;
    }
    int mid=(l+r)>>1;
    int lnum=mid-l+1;
    for(int i=l; i<=r; i++)
    {
        if(val[dep][i]<sorted[mid])
        {
            lnum--;
        }
    }
    int lp=l,rp=mid+1;
    int cur_lnum=0;
    for(int i=l; i<=r; i++)
    {
        if(i==l)
        {
            toleft[dep][i]=0;
        }
        else
        {
            toleft[dep][i]=toleft[dep][i-1];
        }
        if(val[dep][i]<sorted[mid])
        {
            toleft[dep][i]++;
            val[dep+1][lp++]=val[dep][i];
        }
        else if(val[dep][i]>sorted[mid])
        {
            val[dep+1][rp++]=val[dep][i];
        }
        else
        {
            if(cur_lnum<lnum)
            {
                cur_lnum++;
                toleft[dep][i]++;
                val[dep+1][lp++]=val[dep][i];
            }
            else
            {
                val[dep+1][rp++]=val[dep][i];
            }
        }
    }
    build(l,mid,dep+1,rt<<1);
    build(mid+1,r,dep+1,rt<<1|1);
}

int query(int l, int r, int L, int R, int k, int dep, int rt)
{
    if(l==r)
    {
        return val[dep][l];
    }
    int lnum,cur_lnum,rnum,cur_rnum;
    int mid=(l+r)>>1;
    if(l==L)
    {
        lnum=toleft[dep][R];
        cur_lnum=0;
    }
    else
    {
        lnum=toleft[dep][R]-toleft[dep][L-1];
        cur_lnum=toleft[dep][L-1];
    }
    if(lnum>=k)
    {
        int newL=l+cur_lnum;
        int newR=l+lnum+cur_lnum-1;
        return query(l,mid,newL,newR,k,dep+1,rt<<1);
    }
    else
    {
        int rnum=R-L+1-lnum;
        int cur_rnum=L-l-cur_lnum;
        int newL=mid+cur_rnum+1;
        int newR=mid+cur_rnum+rnum;
        return query(mid+1,r,newL,newR,k-lnum,dep+1,rt<<1|1);
    }
}

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&val[0][i]);
            sorted[i]=val[0][i];
        }
        sort(sorted,sorted+n);
        build(0,n-1,0,1);
        while(m--)
        {
            int l,r,k;
            scanf("%d%d%d",&l,&r,&k);
            l--;
            r--;
            printf("%d\n",query(0,n-1,l,r,k,0,1));
        }
    }
    return 0;
}

5、归并树

归并树跟划分树是一对好基友。

不过我短时间内不打算学。

先开个坑,丢个别人的解题报告:


6、主席树(可持久化线段树/函数式线段树)

主席树的核心要义,就是每次更新都只新建被更新了的节点(O(lgn)个),而保存历史版本

感谢sd6001和ftiasch的模板


数组版:

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;

const int MAXN = 100005;
const int MAXM = 2000005;

vector<int> hash;
int a[MAXN];
int tot;

struct NODE
{
    int count;
    int left, right;
};

int root[MAXN];
NODE node[MAXM];

int null;

int newnode(int count, int left, int right)
{
    node[tot].count=count;
    node[tot].left=left;
    node[tot].right=right;
    return tot++;
}

int insert(int rt, int l, int r, int k)
{
    if (l <= k && k <= r)
    {
        if (l == r)
        {
            return newnode(node[rt].count + 1, 0, 0);
        }
        int m = (l + r) >> 1;
        return newnode(node[rt].count + 1,
                       insert(node[rt].left, l, m, k),
                       insert(node[rt].right, m + 1, r, k));
    }
    return rt;
}

int query(int p, int q, int l, int r, int k)
{
    if (l == r)
    {
        return hash[l];
    }
    int m = (l + r) >> 1;
    int cot = node[node[q].left].count - node[node[p].left].count;
    if (cot >= k)
    {
        return query(node[p].left, node[q].left, l, m, k);
    }
    return query(node[p].right, node[q].right, m + 1, r, k - cot);
}

int main()
{
    int cas;
    scanf("%d", &cas);
    while(cas --)
    {
        int n, q;
        scanf("%d%d", &n, &q);
        hash.clear();
        tot = 0;
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d", &a[i]);
            hash.push_back(a[i]);
        }
        sort(hash.begin(), hash.end());
        hash.erase(unique(hash.begin(), hash.end()), hash.end());
        int m = hash.size();
        null = newnode(0, 0, 0);
        root[0] = newnode(0, 0, 0);
        for(int i = 1; i <= n; i ++)
        {
            a[i] = lower_bound(hash.begin(), hash.end(), a[i]) - hash.begin();
            root[i] = insert(root[i - 1], 0, m - 1, a[i]);
        }
        while(q--)
        {
            int l, r, k;
            scanf("%d%d%d", &l, &r, &k);
            printf("%d\n", query(root[l - 1], root[r], 0, m - 1, k));
        }
    }
    return 0;
}

动态分配内存版:

注意:由于这个模板只有new没有delete,所以可想而知所有case的申请内存都叠加在了一起,分分钟MLE无鸭梨。

目前这个模板只能过SOJ 3147。不过在单case评测的OJ,这样写还是很优雅的。

#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;

const int MAXN = 100005;
vector<int> hash;
int a[MAXN];

struct node
{
    int count;
    node *left, *right;
    node(int count, node* left, node* right):
        count(count), left(left), right(right) {}
    node* insert(int k);
    node* insert(int l, int r, int k);
};

node* root[MAXN];

node* null = new node(0, NULL, NULL);

node* node::insert(int l, int r, int k)
{
    if (l <= k && k <= r)
    {
        if (l==r)
        {
            return new node(this->count + 1, null, null);
        }
        int m = (l + r) >> 1;
        return new node(this->count + 1,
                        this->left->insert(l, m, k),
                        this->right->insert(m + 1, r, k));
    }
    return this;
}

int query(node *p, node *q, int l, int r, int k)
{
    if (l == r)
    {
        return hash[l];
    }
    int m = (l + r) >> 1;
    int cot = q->left->count - p->left->count;
    if (cot >= k)
    {
        return query(p->left, q->left, l, m, k);
    }
    return query(p->right, q->right, m+1, r, k - cot);
}

int main()
{
    int cas;
    null->left = null->right = null;
    scanf("%d", &cas);
    while(cas --)
    {
        int n,q;
        scanf("%d%d", &n, &q);
        hash.clear();
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d", &a[i]);
            hash.push_back(a[i]);
        }
        sort(hash.begin(), hash.end());
        hash.erase(unique(hash.begin(), hash.end()), hash.end());
        int m = hash.size();
        root[0] = null;
        for(int i = 1; i <= n; i ++)
        {
            a[i] = lower_bound(hash.begin(), hash.end(), a[i]) - hash.begin();
            root[i] = root[i-1]->insert(0,m - 1,a[i]);
        }
        while(q --)
        {
            int l, r, k;
            scanf("%d%d%d", &l, &r, &k);
            printf("%d\n", query(root[l - 1], root[r], 0, m - 1, k));
        }
    }
    return 0;
}


7、Treap

Treap做区间第K大数最好做POJ 2761,因为这道题有个条件是区间不包含,否则复杂度会上升很多。

这道题实际上就是维护一个FIFO队列,使得处理某个询问时,treap中只包含正在询问的这个区间。

感谢 ftiasch 的模板。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <climits>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define fi first
#define nd second

using namespace std;
typedef pair<int, int> PII;

const int MAXN = 110000;
const int MAXM = 51000;

int treap_size;
int key[MAXN], weight[MAXN], cot[MAXN], size[MAXN], cld[MAXN][2];

pair<PII, PII> query[MAXM];
int ans[MAXM];
int a[MAXN];

bool cmp(const pair<PII, PII> &a, const pair<PII, PII> &b)
{
    return a.fi < b.fi;
}

void update(int &x)
{
    size[x] = size[cld[x][0]] + size[cld[x][1]] + cot[x];
}

void rotate(int &x, int flg)
{
    int y = cld[x][flg];
    cld[x][flg] = cld[y][flg ^ 1];
    cld[y][flg ^ 1] = x;
    update(x);
    update(y);
    x = y;
}

void insert(int &x, int k)
{
    if(x)
    {
        if(key[x] == k)
        {
            cot[x] ++;
        }
        else
        {
            int flg = key[x] < k;
            insert(cld[x][flg], k);
            if (weight[cld[x][flg]] < weight[x])
            {
                rotate(x, flg);
            }
        }
    }
    else
    {
        x = treap_size ++;
        key[x] = k;
        weight[x] = rand();
        cot[x] = 1;
        cld[x][0] = cld[x][1] = 0;
    }
    update(x);
}

void erase (int &x, int k)
{
    if(key[x] == k)
    {
        if(cot[x] > 1)
        {
            cot[x] --;
        }
        else
        {
            if(!cld[x][0] && !cld[x][1])
            {
                x = 0;
                return;
            }
            rotate(x, ! (weight[cld[x][0]] < weight[cld[x][1]]));
            erase(x, k);
        }
    }
    else
    {
        erase(cld[x][key[x] < k], k);
    }
    update(x);
}

int calc(int &x, int k)
{
    if(size[cld[x][0]] >= k)
    {
        return calc(cld[x][0], k);
    }
    if(k <= size[cld[x][0]] + cot[x])
    {
        return key[x];
    }
    return calc(cld[x][1], k - (size[cld[x][0]] + cot[x]));
}

void treap_init()
{
    treap_size = 1;
    size[0] = 0;
    weight[0] = INT_MAX;
}

int main()
{
    int n, m;
    while(scanf("%d %d", &n, &m) == 2)
    {
        treap_init();
        for(int i = 0; i < n; i ++)
        {
            scanf("%d", &a[i]);
        }
        for(int i = 0; i < m; i ++)
        {
            scanf("%d %d %d", &query[i].fi.fi, &query[i].fi.nd, &query[i].nd.fi);
            query[i].fi.fi --;
            query[i].fi.nd --;
            query[i].nd.nd = i;
        }
        sort(query, query + m, cmp);
        int front = 0, rear = 0;
        int root = 0;
        for(int i = 0; i < m; i ++)
        {
            while(rear <= query[i].fi.nd)
            {
                insert(root, a[rear ++]);
            }
            while(front < query[i].fi.fi)
            {
                erase(root, a[front ++]);
            }
            ans[query[i].nd.nd] = calc(root, query[i].nd.fi);
        }
        for(int i = 0; i < m; i ++)
        {
            printf("%d\n", ans[i]);
        }
    }
    return 0;
}

8、红黑树

这个必须可以搞。。

不过正常人不会想要手写红黑树吧。。

所以也无限期搁置。。


9、SPLAY

待学。

稍安勿躁 >_<

实战对比:VINS和ORBSLAM3在无人机避障中的表现(含实测数据) 本文通过实战测试,深度对比了VINS和ORBSLAM3两种主流视觉SLAM算法在无人机避障中的表现。测试聚焦于光照变化、动态遮挡和快速运动三大挑战,提供了详细的实测数据与性能分析。结果表明,VINS在计算效率和实时性上占优,而ORBSLAM3在定位精度和地图管理方面更稳健,为不同应用场景下的工程选型提供了清晰依据。 阅读详情

相关推荐

【科技前沿】用深度强化学习优化电网,让电力调度更聪明!

Hey小伙伴们,今天我要跟大家分享一个超级酷炫的技术应用——深度强化学习在电网优化中的典型案例!如果你对机器学习感兴趣,或是正寻找如何用AI技术解决实际问题的方法,这篇分享绝对不容错过!👩‍💻✨

Jacklx888的博客 3247

区间第k大(4种求法)

线性区间求第k大是一个老生常谈的问题,我们来总结下4种求解方法(当然远不止这4种,老话说思想有多远就能走多远)。 这里我们对每种方法的各种属性进行一个简单评级(1-5,没有任何倍数关系) 1:主席树 (实现难度:2    时间消耗:2    空间消耗:4 )     主席树能在线求静态的,树状数组套主席树能离线求带修改的。在线,时间复杂度nlogn,空间复杂度nlong,不会的:传送门

小布丁童学 7500

从零到一:RF-DETR如何通过神经架构搜索重塑实时目标检测的边界

RF-DETR通过创新的权重共享神经架构搜索(NAS)机制,重新定义了实时目标检测的技术边界。这项技术在COCO等基准测试中表现卓越,成为首个AP超过60的实时检测器,同时保持跨领域稳定性和高效推理速度。RF-DETR的动态架构调整能力使其能够适应从嵌入式设备到云端服务器的各种硬件环境,为工业质检、自动驾驶等场景提供灵活解决方案。

weixin_29061531的博客 470

区间第k大的几种解法

区间第K大问题,变化包括带修改和不带修改,强制在线和允许离线 修改主要是单点修改,我们前面也只讨论这种情况。 接下来我们从编程复杂度和时空复杂度来讨论几种做法。 1.整体二分(编程复杂度:低-中,时间复杂度:优秀,空间复杂度:优秀) 缺点:只能做离线 优点:空间都是O(n)。常数小。带修改O(nlog2n),不带修改O(nlogn)。 但是不带修改的情况,如果允许的话,...

weixin_30564785的博客 728

EPLAN电气设计精华 -模拟量传感器画法全解

本文介绍了EPLAN中模拟量压力传感器的标准画法要点,重点解析了电流型(4-20mA)、电压型(0-10V/0-5V)和特定应用型三种传感器的核心特点、典型符号、接线方式及应用场景。文章提供了EPLAN设备标识符示例,并分享了一个实际项目案例(XJC-Y01-20-4M传感器配合XJC-608T-F变送器和GSEE.GXLK-AI4S-I模块的应用),强调绘制前查阅技术资料的重要性。内容简明实用,有助于规范电气设计中的传感器绘制。

Qinmingyue13的博客 1183

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

weixin_44240228的博客 1万+

算法训练 区间k大数查询

问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行一个数,表示询问的答...

菲菲家的吴先森 1627

Unity URP项目里Post Processing死活没效果?别急,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果不显示的5个常见问题及解决方案,包括管线配置、Volume设置、摄像机选项、Layer冲突和Shader兼容性。通过专业排查步骤和实用代码片段,帮助开发者快速定位并修复后处理效果失效问题,提升项目开发效率。

weixin_28693309的博客 234

区间第k大值(主席树入门)

K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that

小布丁童学 4595

PCL体素滤波器【2026最新版】

PCL实现的VoxelGrid类和ApproximateVoxelGrid体素滤波,详细记录。博客长期更新,本文最近一次更新时间为:2026年3月14日。

点云侠的博客 39万+

库存管理系统项目部署方案(基于jdk17)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 6380

【划分树】求区间K大数

<br />       求区间K大数,众所周知有二分答案+树套树的做法,每个询问复杂度为O(log3N),可谓近似一个O(N)了,不仅时间复杂度高,编程复杂度也不低,后来才发现还有一种叫划分树的数据结构,专门做这种问题。<br />      本来觉得知道个树套树就够了,据我所知划分树还不支持区间修改操作,但是这次NOI一试的piano偏偏那出题人就有这么重口味,给你来两个500000的点!真是不简单,当时我都在想有没有O(N)的算法了。树套树的复杂度偏偏就被卡掉了,三个点平均每个点要跑5秒,好吧,那就学

Evil.livE 4382

注册GitHub时出现Unable to verify your captcha response.Please visit https://docs.github.com/解决方案(持续更新)

本文主要介绍了注册GitHub时出现Unable to verify your captcha response. Please visit https://docs.github.com/articles/troubleshooting-connectivity-problems/#troubleshooting-the-captcha for troubleshooting information.解决方案,希望能对学习使用GitHub的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

C++蓝桥杯 基础练习之区间k大数查询

C++ 蓝桥杯题目讲解汇总(持续更新) 最近小小摸鱼了一会儿,不过顺便重新理了一下之前做过的基础题,除此以外,顺便学习了一下学校的网课视频和作业,继续开工了,冲! VIP试题 区间k大数查询 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数...

Lurker_hunter的博客 610

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

区间K大数查询(求解方法总结)

问题:在一个无序序列中,查找给定区间中的第K大的数 (这是一个很经典的问题,但是之前并没有深究,最近刷题的时候碰到了,就来总结一波……) Method 1:先排序,然后直接找到第K大的数         这种方法最常规、最易想到且没有限制条件;但是效率比较低,时间复杂度为O(n*log n)(采用高效率的排序算法)         若采用某些效率比较高的排序算法

否定的否定式 4880

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

区间k大数查询简单方法

问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行一个数,表示询问的答案。 样例输入 5 1 2 3 4 5 2 1 5 2 2 3 2 样例输出 4 2 数据规模与约定 对于30%的数据,n,m&

qq_44162236的博客 549

区间k大数查询

区间K大数查询 ##问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行一个数,表示询问的答...

Jenny_yl的博客 332

整体二分之静态区间第K大数

对于整体二分,其他的帖子讲的更详细,而我比较煞笔不看代码根本不知道是什么意思,所以留下代码以供自己后续理解 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<stack> #include...

qq_43469254的博客 369

蓝桥杯练习题 区间k大数查询

算法训练 区间k大数查询 #include&lt;stdio.h&gt; int main() { int n,m,l,r,k,len=1; int i,j,h; int a[1001],b[1001],c[1001]; scanf("%d",&amp;n); for(i=1; i&lt;=n; i++) scanf("%d",&amp;a[i]); scanf("%d",&amp..

qq_41501673的博客 287

python:区间k大数查询

python:区间k大数查询 题目 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 ​ 输入格式 第一行包含一个数n,表示序列长度。 ​ 第二行包含n个正整数,表示给定的序列。 ​ 第三个包含一个正整数m,表示询问个数。 ​ 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 ​ 输出格式 总共...

Claire的博客 374

区间k大数训练

问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行一个数,表示询问的答案。 样例输入 5 1...

莫安逸无风雪 861

59 区间k大数查询

59 区间k大数查询 作者: Turbo时间限制: 1S章节: 基本练习(数组) 问题描述 : 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 注意,由于存在相等的元素,因此,第2大的数可能和第1大的数相等。 输入说明 : 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询...

内在的天空 230

java:区间k大数查询

java:区间k大数查询 题目 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行...

Claire的博客 483

区间K大数查询

问题描述     给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式     第一行包含一个数n,表示序列长度。     第二行包含n个正整数,表示给定的序列。     第三个包含一个正整数m,表示询问个数。     接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式     总共输出m行...

weixin_44268113的博客 399

区间k大数查询 --排序

区间k大数查询 --排序 // An highlighted block package 算法训练; import java.util.Arrays; import java.util.Scanner; public class MainAlo1 { public static void main(String[] args) { Scanner in = new Scanner(Syst...

weixin_42720135的博客 206
上一篇: HDOJ 4612: Warm up
下一篇: HDOJ 4632: Palindrome subsequence
frog1902
博客等级 码龄14年 152粉丝 107原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值