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

思路

实现

丑陋无比的代码

#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. $.getJSON获取json数据失败

    首先简单介绍下 $.ajax  $.get  $.post  $.getJSON 的区别和用法 $.ajax中有一个type属性,专门用来指定是get请求还是post请求的分别对应的就是$.get和$ ...

  2. windows快捷键记录

    -1: 装完iis, run -> inetmgr 弹出iis管理器 0.按住Shift键右击鼠标打开命令行窗口 1.ODBC数据源管理器run->odbcad32 2.计算机管理(查看设 ...

  3. system.run

    客户端开启了remotecommand后可以在server调用该命令在agent上执行一些命令 命令中有逗号 zabbix_get -s xxx.xxx.xxx.xxx -k "system ...

  4. Thingsboard之MQTT设备协议简介

    MQTT基础知识 MQTT是一种轻量级的发布 - 订阅消息传递协议,可能使其最适合各种物联网设备.您可以在此处找到有关MQTT的更多信息.ThingsBoard服务器节点充当MQTT Broker,支 ...

  5. js对象模型3

    3

  6. 解决mysql导入导出错误问题

    1.datetime类型: 当datetime的值为0000-00-00:00:00:00时,mysql是不接受此条数据的,当然可以 insert ignore into table--------- ...

  7. jsp的九大内置对象+四大作用域

    1.request是httpServletRequest的对象,代表发送的请求信息 2.response是httpServletResponse的对象,代表响应请求返回的信息 3.session会话是 ...

  8. 金融计算的开源库——QuantLib 学习入门

    本文在Creative Commons协议下发布. 简介 瞬息万变的金融市场开发出了太多的金融产品,产生了太多的计算问题,这对于 Fintech 来讲:无论是计算能力上的,还是软件设计上的是一个巨大的 ...

  9. Android中创建一个BroadcastReceiver

    首先创建一个java类继承BroadcastReceiver类 package com.example.service; import android.content.BroadcastReceive ...

  10. Linux-redis安装以及客户端搭建

    redis安装: 下载redis数据库,网址:redis官网 将文件放到home或者其他文件夹,cd到文件夹 执行 tar zxvf redis-4.0.2.tar.gz //解压文件 执行make进 ...