hdu4417 划分树+二分
//Accepted 14796 KB 453 ms //划分树 //把查询的次数m打成n,也是醉了一晚上!!! //二分l--r区间第k大的数和h比较 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持不下去了,就想想你为什么走到这儿! * @authr songt */ ; struct node { int val[imax_n]; int num[imax_n]; }f[]; int a[imax_n]; int sorted[imax_n]; int n,m; void build(int t,int l,int r) { if (l==r) return ; ; ; ; for (int i=l;i<=r;i++) if (f[t].val[i]<sorted[mid]) isame--; int ln=l; ; for (int i=l;i<=r;i++) { if (i==l) { f[t].num[i]=; } ]; if (f[t].val[i]<sorted[mid]) { f[t].num[i]++; f[t+].val[ln++]=f[t].val[i]; } else if (f[t].val[i]>sorted[mid]) { f[t+].val[rn++]=f[t].val[i]; } else { if (isame>same) { same++; f[t].num[i]++; f[t+].val[ln++]=f[t].val[i]; } else { f[t+].val[rn++]=f[t].val[i]; } } } build(t+,l,mid); build(t+,mid+,r); } int query(int t,int l,int r,int a,int b,int k) { if (l==r) return f[t].val[l]; ; int s,ss; if (a==l) { ss=; s=f[t].num[b]; } else { ss=f[t].num[a-]; s=f[t].num[b]-ss; } if (s>=k) { a=l+ss; b=l+ss+s-; ,l,mid,a,b,k); } else { int b1=a-l-ss; -s; a=mid++b1; b=mid+b1+b2; ,mid+,r,a,b,k-s); } } int x,y,h; void slove() { build(,,n); ;i<=m;i++) { scanf("%d%d%d",&x,&y,&h); x++; y++; ,r=y-x+; ; ; while (l<=r) { mid=(l+r)/; ,,n,x,y,mid); //printf("pre :l=%d r=%d mid=%d t=%d\n",l,r,mid,t); ; else { ans=mid; l=mid+; } //printf("l=%d r=%d t=%d\n",l,r,t); } printf("%d\n",ans); } } int main() { int T; ; scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); ;i<=n;i++) { scanf("%d",&a[i]); f[].val[i]=sorted[i]=a[i]; } sort(sorted+,sorted+n+); printf("Case %d:\n",++t); slove(); } ; }
hdu4417 划分树+二分的更多相关文章
- HDU-4417 Super Mario,划分树+二分!
Super Mario 这个题也做了一天,思路是很清晰,不过二分那里写残了,然后又是无限RE.. 题意:就是查询区间不大于k的数的个数. 思路:裸划分树+二分答案.将区间长度作为二分范围.这个是重点. ...
- sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)
Boring Counting Time Limit: 3000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 In this problem you a ...
- SDIBT 3237 Boring Counting( 划分树+二分枚举 )
http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec ...
- HDU 4417 划分树+二分
题意:有n个数.m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质.二分查找在区间[l,r]小于等于k的个数. 假设在区间第 i ...
- HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)
题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...
- 【划分树+二分】HDU 4417 Super Mario
第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
- 13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 2224: Boring Counting Time Limit: 3 Sec ...
- HDU 4417 Super Mario(划分树+二分)
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- poj 2104:K-th Number(划分树,经典题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 35653 Accepted: 11382 Ca ...
随机推荐
- win8style布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
- AOP 之 6.1 AOP基础(拾陆)
6.1.1 AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平 ...
- python 练习 26
Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. br ...
- .NET Reflector 8.2支持VS2013高亮显示和代码地图视图
Red Gate Software公司最近发布的.NET Reflector 8.2支持Visual Studio 2013,其Reflector 桌面程序能够转换十六进制/十进制值.桌面程序还支持局 ...
- 如何使用Vbox添加虚拟机
简介 :vbox是oracle旗下的一个免费的虚拟机软件. 个人感觉操作方便,至少比VM要好用的多. 如果有已经制作好的 点击下一步: 下一步 找到之后 创建 look
- web基础之hibernate(一篇)
hibernate的一些基本的认识 1. hibenate是一个框架(framework) 2. hibernate是一个orm框架 3. orm(object r ...
- hdu5882 Balanced Game
题目链接:hdu5882 Balanced Game 题解:每种手势的攻防数一样,不难想到n为奇数时游戏平衡. #include<cstdio> #include<cstring&g ...
- ECC中的CRM UI端摆弄
前段时间想搞CRM了,可是公司没有环境,就去ECC直接试试事务码,结果竟然可以打开网页...兴奋之余又去看了一下CRM里的一些CLASS,结果很多都是没有的.沮丧! 后来想想,只能用UI的框架,挂WD ...
- guava学习--Optional可空类型
转载:http://www.cnblogs.com/whitewolf/p/4231783.html Null sucks 回到本文主题Optional.在我日常编程中NullPointerExcep ...
- java8Lambda详解
[移步] http://blog.csdn.net/ioriogami/article/details/12782141/