POJ-2104 K-th Number CDQ分治
题意:给你一个序列,长度为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分治的更多相关文章
- POJ 2104:K-th Number 整体二分
感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...
- POJ 2104:K-th Number(主席树静态区间k大)
题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...
- POJ 2104:K-th Number(整体二分)
http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- POJ 2104&HDU 2665 Kth number(主席树入门+离散化)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 50247 Accepted: 17101 Ca ...
- K-th Number POJ - 2104
K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...
- POJ 2104 K-th Number【整体二分 + 树状数组】
本来只是想学一下CDQ,还是先把整体二分搞懂一点. 这题窝几个月前分别用划分树,树套树,主席树和挑战上介绍的分桶法实现了一发(然而现在都忘得差不多了) 最快的是划分树,其次是主席树,然后是树套树,还有 ...
- K-th Number POJ - 2104 划分树
K-th Number You are working for Macrohard company in data structures department. After failing your ...
- poj 2104 K-th Number 主席树+超级详细解释
poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...
随机推荐
- VSTO之PowerPoint(PPT)插件开发常用API汇总
VSTO简介 VSTO(Visual Studio Tools for Office )是VBA的替代,使得开发Office应用程序更加简单,并且用VSTO来开发office应用程序可以使用Visua ...
- Java - 自动配置log4j的日志文件路径
目录 1 日志路径带来的痛点 2 log4j.properties文件的配置 3 彻底解决痛点 3.1 单独的Java程序包 (非Java Web项目) 3.2 Web项目 4 附录 - 获取当前项目 ...
- ibatis 核心原理解析!
关注下方公众号,可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 最近查找一个生产问题的原因,需要深入研究 ibatis 框架的源码.虽然最后证明问题的原因与 ibat ...
- 8.源码分析---从设计模式中看SOFARPC中的EventBus?
我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBu ...
- linux安装启动mongodb
1:下载 http://www.mongodb.org/downloads 在85机器上上传压缩包后解压缩. 首先在linux中解压缩安装程序 通过命令操作: 解压 tar -zxvf mongodb ...
- 汇总VSCode中比较好用的插件
使用vscode编辑器两年的时间,总结出前端一些比较方便的插件 1. Auto Close Tag 自动添加HTML / XML关闭标签 2. Auto Complete Tag 自动完成标签 3 A ...
- 洛谷 P4127 [AHOI2009]同类分布
题意简述 求l~r之间各位数字之和能整除原数的数的个数. 题解思路 数位DP 代码 #include <cstdio> #include <cstring> typedef l ...
- 配置Windows Server 2008环境
上一章已经把Windows Server2008操作系统安装完毕,接下来配置一下Windows Server环境.配置网络和共享中心.配置桌面环境.配置用户IE设置.安装Telnet远程工具.配置文件 ...
- JavaWeb无框架,借助反射采用精巧设计模式实现放微信PC聊天页面
本周开始在写仿写一个微信PC端的聊天页面,没有使用ssh.ssm等框架,采用JavaWeb.反射.MySQL.C3P0等技术.这里把其中和核心技术列出来请大家指教. 与传统JavaWeb项目的区别 传 ...
- webpack4 前端框架基础配置实例-解决css分离图片路径问题
1.安装nodejs 2. 需要全局和项目安装webpack和webpack-dev-server npm install webpack webpack-dev-server -g npm inst ...