题目传送门

题意:给你一个序列,长度为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. LeetCode 85. 冗余连接 II

    题目: 在本问题中,有根树指满足以下条件的有向图.该树只有一个根节点,所有其他节点都是该根节点的后继.每一个节点只有一个父节点,除了根节点没有父节点. 输入一个有向图,该图由一个有着N个节点 (节点值 ...

  2. 创建docker容器遇到的错误

    1.问题截图 2.问题描述 出现该问题就是docker版本和系统版本不兼容导致的. 现在的系统版本和docker的版本如下: 3.问题解决 安装低版本的docker或者高版本的系统(Centos7.4 ...

  3. 通过Blazor使用C#开发SPA单页面应用程序(3)

    今天我们来看看Blazor开发的一些基本知识. 一.Blazor组件结构 Blazor中组件的基本结构可以分为3个部分,如下所示: //Counter.razor //Directives secti ...

  4. 面试java后端面经_3

    小姐姐说:你一点都不懂表达,一点都不懂爱情,一点也不爱我! 你答:你知道吗,我听说过一个这样的故事,讲的就是有一个小女孩和一个男孩在一起,小男孩呢很不幸是位聋哑人,虽然如此,但是他们的日子过得特别的美 ...

  5. js 事件发布订阅销毁

    在vue中 通过$on订阅事件,通过$emit触发事件以此可用来事件跨组件传值等功能,但是有个弊端就是通过这种方式订阅的事件可能会触发多次. 特别是通过$on订阅的事件中如果有http请求,将会造成触 ...

  6. vue 异步加载远程组件(支持编译less语法)

    本代码已组件化,可以直接使用. 说明:本组件可以直接解析.vue文件,为了支持less语法解析,在组件中引入less.js,可在less官网下载. 组件代码 <template> < ...

  7. BeautifulSoup 库简单学习使用

    from bs4 import BeautifulSoup as BS # 首先是初始化一个BeautifulSoup的对象 soup = BS(text,'lxml') 示例: from bs4 i ...

  8. VSCode 使用Settings Sync同步配置(最新版教程,非常简单)

    VSCode 使用Settings Sync同步配置(最新版教程,非常简单) 之前无意中听到有人说,vsCode最大的缺点就是每次换个电脑或者临时去个新环境,就要配置一下各种插件,好不麻烦,以至于面试 ...

  9. mongo常用语法

    首先要能进入控制台,进不去自己解决. 基本操作: show users:显示用户 show dbs:显示数据库列表 use <db name> 切换/创建数据库 show collecti ...

  10. springboot中的外界jar的引入:

    <!-- 小米推送jar配置Start --> <dependency> <groupId>com.xiao.mi.push</groupId> < ...