题目传送门

题意:给你一个序列,长度为n,m次询问,询问一段区间的第k大。

题解:CDQ分治,对整个值域进行分治。每次取一个mid, 计算出整个区间内mid <= 的数目,如果 num >= k, 那么就可以第k大的数一定落在[ l, mid]之间, 否者就会落在 [mid+1, r]之间, 然后我们继续递归二分下去,直到 l == r 那么就找到第k大了。

代码:

 #include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 2e5 + ;
int n;
struct Node{
int op;
int L, R;
int x, id;
}A[N], lf[N], ri[N];
int tot = ;
void NowNode(int op, int L, int R, int x, int id){
++tot;
A[tot].op = op; A[tot].L = L; A[tot].R = R;
A[tot].x = x; A[tot].id = id;
}
int ans[N];
int tree[N];
int Mn = inf, Mx = ;
void Add(int x, int v){
for(int i = x; i <= n; i += i & (-i)){
tree[i] += v;
}
}
int Query(int x){
int ret = ;
for(int i = x; i; i -= i&(-i)){
ret += tree[i];
}
return ret;
}
void cdq(int Lval, int Rval, int st, int ed){
if(Lval > Rval || st > ed) return ;
if(Lval == Rval){
for(int i = st; i <= ed; i++)
if(A[i].op == ) ans[A[i].id] = Lval;
return ;
}
int mid = Lval + Rval >> ; int lsz = , rsz = ;
for(int i = st; i <= ed; i++){
int op = A[i].op, x = A[i].x, L = A[i].L, R = A[i].R, id = A[i].id;
if(op == ){
if(x <= mid){
Add(A[i].id, );
lf[++lsz] = A[i];
}
else ri[++rsz] = A[i];
}
else if(A[i].op == ){
int num = Query(R) - Query(L-);
if(num >= x) lf[++lsz] = A[i];
else {
A[i].x -= num;
ri[++rsz] = A[i];
}
}
}
for(int i = ; i <= lsz; i++) { if(lf[i].op == ) {
Add(lf[i].id, -);
}
A[st + i - ] = lf[i];
}
for(int i = ; i <= rsz; i++) A[st + lsz + i - ] = ri[i];
cdq(Lval, mid, st, st+lsz-);
cdq(mid+, Rval, st+lsz, ed);
}
int main(){
int m, val, l, r;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
scanf("%d", &val);
NowNode(,,,val,i);
Mn = min(Mn, val);
Mx = max(Mx, val);
}
for(int i = ; i <= m; i++){
scanf("%d%d%d", &l, &r, &val);
NowNode(,l,r,val,i);
}
cdq(Mn,Mx,,n+m);
for(int i = ; i <= m; i++){
printf("%d\n", ans[i]);
}
return ;
}

POJ-2104 K-th Number CDQ分治的更多相关文章

  1. POJ 2104:K-th Number 整体二分

    感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...

  2. POJ 2104:K-th Number(主席树静态区间k大)

    题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...

  3. POJ 2104:K-th Number(整体二分)

    http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...

  4. 【POJ 2104】 K-th Number 主席树模板题

    达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...

  5. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  6. K-th Number POJ - 2104

    K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...

  7. POJ 2104 K-th Number【整体二分 + 树状数组】

    本来只是想学一下CDQ,还是先把整体二分搞懂一点. 这题窝几个月前分别用划分树,树套树,主席树和挑战上介绍的分桶法实现了一发(然而现在都忘得差不多了) 最快的是划分树,其次是主席树,然后是树套树,还有 ...

  8. K-th Number POJ - 2104 划分树

    K-th Number You are working for Macrohard company in data structures department. After failing your ...

  9. poj 2104 K-th Number 主席树+超级详细解释

    poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...

随机推荐

  1. 线上调试bug

    在以往的工作中,线上一有bug,就需要把文件弄到本地来改,但经常会碰见本地环境又和线上不一样,导致调试困难,闭着眼睛改好之后传到线上去看对不对,不对的话又要改,循环往复,要多麻烦就有多麻烦啊. 今天给 ...

  2. IO流与NIO流

    JAVA IO流最详解   (转自CSDN) IO流上:概述.字符流.缓冲区(java基础)   一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数 ...

  3. 1、大型项目的接口自动化实践记录--robotframework环境搭建

    因为人力.团队技术问题,选用robotframework来做自动化,首先说下环境搭建 齐涛道长的入门教程非常棒:http://blog.csdn.net/tulituqi/article/detail ...

  4. 微信小程序的视图与渲染

    1.组件的基本使用 <button type="default" > default </button> <button type="pri ...

  5. tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)

    tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...

  6. redhat linux 5.3修改Java环境变量

    需要配置的环境变量 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把jdk安装目录下的bin目录增 ...

  7. (六)c#Winform自定义控件-单选框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  8. (十七)c#Winform自定义控件-基类窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  9. Go-TCP粘包

    TCP黏包 黏包示例 服务端代码如下: // socket_stick/server/main.go func process(conn net.Conn) { defer conn.Close() ...

  10. Python RPC 之 gRPC

    gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...