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

思路

实现

丑陋无比的代码

#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;
}
}

静态区间第k小 - 整体二分的更多相关文章

  1. 【XSY2720】区间第k小 整体二分 可持久化线段树

    题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...

  2. POJ2104 K-th Number —— 区间第k小 整体二分

    题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Tota ...

  3. Dynamic Rankings || 动态/静态区间第k小(主席树)

    JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...

  4. 静态区间第K小(整体二分、主席树)

    题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...

  5. 51nod 1175 区间第k大 整体二分

    题意: 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 分析: 仅仅就是一道整体二分的入门题而已,没听说过整体二分? 其实就是一个分治的函数 ...

  6. POJ2104&&HDU2665(静态区间第K小)

    题目大意 给定一个有N个数字的序列,然后又m个查询,形式如下: l r k 要求你返回区间[l,r]第k小的数是哪个 题解 终于弄懂主席树是个啥东西了,O(∩_∩)O~~,这题正是主席树的裸题,主席树 ...

  7. [luogu3834]静态区间第k小【主席树】

    传送门:https://www.luogu.org/problemnew/show/P3834 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 分析 很多人都说是用 ...

  8. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

  9. POJ2104 K-th Number —— 静态区间第k小

    题目链接:http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Sub ...

随机推荐

  1. BIO&NIO

    在BIO中只有一个核心对象--Stream,它是单向的数据传输通道,即每个Stream要么是输入要么是输出的,不可兼得.开发人员是面向Stream进行编程的. 在NIO中有三个核心对象--Seleto ...

  2. 黑龙江大学图书馆抢座python

    2019.11.01 增加成功发送QQ邮件. 2019.10.31更新 晚上测试成功 ========================== 昨晚肝了一晚上,今天已经写出成品并且部署到服务器上了,代码很 ...

  3. MATLAB中冒号的用法解析

    MATLAB中冒号的用法解析 1.: 表示所有的意思. (1)如:a(1,:) 表示a的第1行,示例: 结果: 同样的如果a(2,:)表示a的第2行 (2)反过来,a(:,2) 表示a的第3列,示例: ...

  4. 解决“此Flash Player与您的地区不相容”

    1.进入C:\Windows\System32\drivers\etc目录,将hosts文件拷贝到桌面,然后用文本编辑器,比如记事本,打开,在最后一行添加: 127.0.0.1 geo2.adobe. ...

  5. 【macOS使用技巧】使用空格键快速预览文件内容

    Quickview 是mac系统上一个强大的预览功能, 可以预览 mp4 mov等音频文件, 当然图片.文本.也都可以进行预览. 在系统中如果你希望快速浏览一下文件而不想打开的文件的话只要选择文件然后 ...

  6. 消息总线:Spring Cloud Stream

    最近在学习Spring Cloud的知识,现将消息总线:Spring Cloud Stream 的相关知识笔记整理如下.[采用 oneNote格式排版]

  7. [CF1311B] WeirdSort

    Solution 按照 \(p[i]\) 进行分段,如果某个 \(k\) 不存在 \(p[i]=k\),那么就把 \(i,i+1\) 分割开 处理出每一段的左端点和右端点 进而处理出每段的最小值和最大 ...

  8. css3元素如何扭曲、移位或旋转

    css3 transform 兼容性:IE10+ transform:rotate(deg) 正数为顺时针,负数为逆时针 <!DOCTYPE html> <html lang=&qu ...

  9. 搭建网页HTML结构

    div 块级标签 span 行内标签 <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  10. UTF-8(bom-non)

    Public Sub WriteUTF_8BomNon(ByVal fileName As String, ByVal strLine As String) Dim stream: Set strea ...