http://acm.hdu.edu.cn/showproblem.php?pid=4417

题意:

给定一个长度为n的序列,求区间[L,R]中小于h的个数;

思路:

分三种情况:

1:如果该区间最小值都大于h输出0;

2:如果该区间最大值小于等于h输出区间长度:

3:否则,二分枚举该区间的第m大,直到找到第m大为最后一个小于等于h的;

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a , b) ((a) < (b) ? (a) : (b))
#define Max(a , b) ((a) > (b) ? (a) : (b))#define ll __int64
#define inf 0x7f7f7f7f
#define MOD 100000007
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 100007
#define N 100007
using namespace std;
//freopen("din.txt","r",stdin);
struct node{int l,r;int mid(){return (l + r)>>1;}
}tt[N<<2];int toLeft[20][N],val[20][N];
int sorted[N];
int n,m;
int MIN,MAX;void build(int l,int r,int rt,int d){int i;tt[rt].l = l;tt[rt].r = r;if (l == r) return ;int m = tt[rt].mid();int lsame = m - l + 1;for (i = l; i <= r; ++i){if (val[d][i] < sorted[m]) lsame--;}int lpos = l,rpos = m + 1;int same = 0;for (i = l; i <= r; ++i){if (i == l) toLeft[d][i] = 0;else toLeft[d][i] = toLeft[d][i - 1];if (val[d][i] < sorted[m]){toLeft[d][i]++;val[d + 1][lpos++] = val[d][i];}else if (val[d][i] > sorted[m]){val[d + 1][rpos++] = val[d][i];}else{if (same < lsame){same++;val[d + 1][lpos++] = val[d][i];toLeft[d][i]++;}else{val[d + 1][rpos++] = val[d][i];}}}build(lc,d + 1);build(rc,d + 1);
}
int query(int L,int R,int k,int d,int rt){if (L == R) return val[d][L];int s,ss;if (L == tt[rt].l){ss = 0;s = toLeft[d][R];}else{ss = toLeft[d][L - 1];s = toLeft[d][R] - toLeft[d][L - 1];}if (s >= k){int newl = tt[rt].l + ss;int newr = newl + s - 1;return query(newl,newr,k,d + 1,rt<<1);}else{int m = tt[rt].mid();int bb = L - tt[rt].l - ss;int b = R - L + 1 - s;int newl = m + bb + 1;int newr = newl + b - 1;return query(newl,newr,k - s,d + 1,rt<<1|1);}
}
int bSearch(int l,int r,int h,int x,int y){int ans = 0;while (l <= r){int m = (l + r)>>1;if (query(x,y,m,0,1) > h)r = m - 1;else{l = m + 1;ans = m;}}return ans;
}
int Input(){char ch = getchar();while (ch < '0' || ch > '9') ch = getchar();int num = 0;while (ch >= '0' && ch <= '9'){num = num*10 + ch - '0';ch = getchar();}return num;
}
int main(){//freopen("din.txt","r",stdin);int t,i;int x,y,h;int cas = 1;t = Input();while (t--){printf("Case %d:\n",cas++);n = Input();m = Input();for (i = 1; i <= n; ++i){val[0][i] = Input();sorted[i] = val[0][i];}sort(sorted + 1,sorted + 1 + n);build(1,n,1,0);while (m--){x = Input();y = Input();h = Input();x++; y++;MIN = 1;MAX = y - x + 1;if (query(x,y,MIN,0,1) > h) puts("0");else if (query(x,y,MAX,0,1) <= h) printf("%d\n",MAX);else{int pos = bSearch(MIN,MAX,h,x,y);printf("%d\n",pos);}}}return 0;
}

转载于:https://www.cnblogs.com/E-star/archive/2012/09/26/2703545.html

hdu 4417 Super Mario 划分树+二分相关推荐

  1. HDU 4417 Super Mario(划分树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. #HDU 4417 Super Mario (主席树 + 二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  5. HDU - 4417 Super Mario(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  6. HDU 4417 Super Mario(离线 + 树状数组)

    题目: Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded ...

  7. HDU 4417 Super Mario

    划分树 + 二分 二分枚举第k小的数与h比较大小. #include <stdio.h> #include <string.h> #include <stdlib.h&g ...

  8. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  9. hdu 4417 Super Mario 树状数组||主席树

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

最新文章

  1. BZOJ1975 [Sdoi2010]魔法猪学院 k短路
  2. rtp 多媒体流同步控制 实时传输协议 简介
  3. Oracle 10g OCP 042 题库 1-30 题 共168题
  4. Android中WebView加载sdcard中的html显示
  5. 编程方法学14:内存
  6. prism项目搭建 wpf_Prism完成的一个WPF项目
  7. 北航计算机学院有河南的,北航计划在豫招生165人 河南多所高职公布预录名单...
  8. python条件语句练习题_python学习-7 条件语句 while循环 + 练习题
  9. 安卓应用安全指南 4.7 使用可浏览的意图
  10. HTML+CSS制作漂浮的对话框
  11. Nginx的端口修改问题
  12. three 实现绕物体旋转,卫星绕星球旋转
  13. NetBEUI协议巧安装
  14. win10更改了用户名后远程登录还要用原来的用户名怎么修改
  15. 1.OCR--文本检测算法FCENet
  16. 图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
  17. Jetson-Xavier-NX刷机+pytorch环境配置+yolov5运行
  18. CentOS 环境下的一些配置(安装软件)
  19. no matching host key type found. Their offer: ssh-rsa 问题解决
  20. 《SQL Server2008R2数据挖掘与商业智能》实例——决策树

热门文章

  1. C# Http方式下载文件到本地类改进版
  2. MongoDB 连接数高产生原因及解决
  3. SVN switch 用法详解 (ZZ)
  4. php-echo原理
  5. Object.defineProperty与双向绑定、数据监听
  6. MySQL 8.0 首个自适应参数横空出世
  7. vue-自定义组件传值
  8. [转] WinForm实现移除控件某个事件的方法
  9. 学习笔记#Android Studio 从安装到虚拟机启动
  10. Hadoop和大数据:60款顶级开源工具