zoukankan      html  css  js  c++  java
  • 静态区间第k小

    蒟蒻终于学会整体二分啦!

    思路

    实现

    丑陋无比的代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 200005;
    int ar[N];
    int lowbit(int t) { return t & (-t); }
    void add(int i, int v) {
    	for (; i < N; ar[i] += v, i += lowbit(i));
    }
    int sum(int i) {
    	int s = 0;
    	for (; i > 0; s += ar[i], i -= lowbit(i));
    	return s;
    }
    
    
    struct Elem {
        int pos,val;
        bool operator < (const Elem &b) {
            return val < b.val;
        }
    } e[200005];
    
    struct Query {
        int l,r,k,ans;
    } q[200005];
    
    int n,m,a[200005];
    
    void solve(int l,int r,vector<int> num,vector <int> v) {
        //cout<<l<<" "<<r<<" "<<num.size()<<" "<<v.size()<<endl;
        if(l==r) {
            for(int i=0;i<v.size();i++) {
                q[v[i]].ans = l;
            }
        }
        else {
            memset(ar,0,sizeof ar);
            vector <int> v1,v2,n1,n2;
            int mid = (l+r)>>1;
            for(int i=0;i<num.size();i++) {
                if(e[num[i]].val<=mid) {
                    add(e[num[i]].pos,1);
                    n1.push_back(num[i]);
                }
                else {
                    n2.push_back(num[i]);
                }
            }
            for(int i=0;i<v.size();i++) {
                if(sum(q[v[i]].r)-sum(q[v[i]].l-1) >= q[v[i]].k) {
                    v1.push_back(v[i]);
                }
                else {
                    q[v[i]].k -= sum(q[v[i]].r)-sum(q[v[i]].l-1);
                    v2.push_back(v[i]);
                }
            }
            if(v1.size()) solve(l,mid,n1,v1);
            if(v2.size()) solve(mid+1,r,n2,v2);
        }
    }
    
    int main() {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
            e[i].pos=i;
            e[i].val=a[i];
        }
        sort(e+1,e+n+1);
        for(int i=1;i<=m;i++) {
            scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
        }
        vector <int> tmp;
        vector <int> num;
        for(int i=1;i<=n;i++) {
            num.push_back(i);
        }
        for(int i=1;i<=m;i++) {
            tmp.push_back(i);
        }
        solve(-1e+9,1e+9,num,tmp);
        for(int i=1;i<=m;i++) {
            cout<<q[i].ans<<endl;
        }
    }
    
  • 相关阅读:
    不敢想,做个博客竟如此简单!
    我有一台服务器,能干啥?
    精品 IDEA 插件大汇总!值得收藏
    怒肝半月!Python 学习路线+资源大汇总
    怒肝 Linux 学习路线,这回不难
    多环境
    分享 10 个高星的创意项目!
    js的attribute
    选择大厂该做哪些准备?|小白进入大厂现状
    小白程序猿了解大厂的开发模式
  • 原文地址:https://www.cnblogs.com/mollnn/p/12273409.html
Copyright © 2011-2022 走看看