hdu 4417 划分树
思路:二分枚举区间第k大。用划分树查找是否符合要求的高度。
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #define Maxn 100010 #define lson(x) x<<1 #define rson(x) x<<1|1 #define mid ((tree[po].l+tree[po].r)>>1) using namespace std; int val[20][Maxn],toLeft[20][Maxn],sorted[Maxn]; struct Tree{int l,r; }tree[Maxn*4]; void BuildTree(int l,int r,int dep,int po) {tree[po].l=l,tree[po].r=r;if(l==r)return ;int same=mid-l+1,i;for(i=l;i<=r;i++)if(val[dep][i]<sorted[mid])same--;int lpos=l,rpos=mid+1;for(i=l;i<=r;i++){if(i==l)toLeft[dep][i]=0;elsetoLeft[dep][i]=toLeft[dep][i-1];if(val[dep][i]<sorted[mid])toLeft[dep][i]++,val[dep+1][lpos++]=val[dep][i];elseif(val[dep][i]>sorted[mid])val[dep+1][rpos++]=val[dep][i];elseif(same)toLeft[dep][i]++,val[dep+1][lpos++]=val[dep][i],same--;elseval[dep+1][rpos++]=val[dep][i];}BuildTree(l,mid,dep+1,lson(po));BuildTree(mid+1,r,dep+1,rson(po)); } int query(int l,int r,int k,int dep,int po) {if(l==r)return val[dep][l];int vd,invd;if(l==tree[po].l){vd=toLeft[dep][r];invd=0;}else{vd=toLeft[dep][r]-toLeft[dep][l-1];invd=toLeft[dep][l-1];}if(vd>=k){int newl=invd+tree[po].l;int newr=invd+vd+tree[po].l-1;return query(newl,newr,k,dep+1,lson(po));}else{int ss=l-tree[po].l-invd;int s=r-l+1-vd;int newl=mid+ss+1;int newr=mid+ss+s;return query(newl,newr,k-vd,dep+1,rson(po));} } int solve(int s,int t,int x) {int i,j,l,r,Mid;l=0,r=t-s+1;while(l+1<r){Mid=(l+r)>>1;int temp=query(s,t,Mid,0,1);if(temp>x)r=Mid-1;elsel=Mid;}if(r>=1)if(query(s,t,r,0,1)<=x)return r;return l; } int main() {int n,m,i,j,l,r,Case=0,t,x;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&val[0][i]);sorted[i]=val[0][i];}sort(sorted+1,sorted+1+n);BuildTree(1,n,0,1);printf("Case %d:\n",++Case);for(i=1;i<=m;i++){scanf("%d%d%d",&l,&r,&x);l++,r++;printf("%d\n",solve(l,r,x));}}return 0; }
转载于:https://www.cnblogs.com/wangfang20/p/3248418.html
hdu 4417 划分树相关推荐
- hdu 4417(线段树OR树状数组)
题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...
- 【划分树+二分】HDU 4417 Super Mario
第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 3473 Minimum Sum 划分树
http://acm.hdu.edu.cn/showproblem.php?pid=3473 对于xl,xl+1--xr,使得[xi-x]和最小,显然x应当为其中的中位数.中位数可以通过求K大数解决, ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- HDU 3473 Minimum Sum 【划分树】
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3473 ★没想到划分树里面也可以加东西,wcsl 题意: 给你一个由n个数组成的序列,有m次询问,每次询 ...
- 划分树基础 —— HDU 2665 Kth number
对应 HDU 题目 :点击打开链接 Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【划分树】 POJ 2104 HDU 2665 K-th Number 裸题
了解了.... #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ma ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
最新文章
- c语言折半查找法程序,C语言基础:二分查找法演示代码
- MPB:南农成艳芬组-​瘤胃厌氧真菌代谢产物的检测方法
- AIX 操作系统日常维护须知
- ThinkPHP第二十三天(Category表结构、PHPExcel导入数据函数)
- mysql子查询字符串位置_MySql基础-子查询
- java入门第六天课程_Java基础学习第六天 小游戏
- 令人深思的联系-this关键字(隐藏属性static)
- Hessian Matrix
- 在html中添加class,在HTML标识符的Class中加入Styles
- java linux任务管理器_Linux系列教程(二十四)——Linux的系统管理
- 怎么批量给文件夹名称加上数字序号前缀?怎么对文件夹名称进行编号排序?
- 深度学习Tir-Hi3559A使用unbuntu系统的烧写步骤
- 【024】基于51单片机的电子琴加音乐播放器系统Proteus仿真设计
- 我的第一篇CSDN博客
- 哈尔滨工业大学邮件系统客户端设置
- 从零开始写一个RTSP服务器(一)RTSP协议讲解
- SX1278设计(硬件部分)
- 企业运维之kubernetes监控
- Deep Learning(深度学习)资料汇总
- Lora SX1278芯片 模块引脚的功能介绍
热门文章
- funm--矩阵的函数运算
- vue-admin模板第一次使用存在的坑
- 雅克比迭代法求方程组的解(Python实现)
- 【大脑】改善记忆力的食物有哪些
- 什么是Java内存模型中的happens-before
- Tomcat8.0 JDK1.8 的详细配置 Win10
- BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()
- hdu1166敌兵布阵hdu1754I Hate It(线段树入门)
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
- 301重定向怎么进行URL标准化设置?