poj2104 线段树 划分树
学习:http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html
划分树的build:
划分树是分层构建的,在构建的t层时,我们可以得到第t层的num域,和分入左右孩子的元素
num域值该区间中从左到某个位置小于指定值的数的个数
查找可以看代码
//Accepted 28504 KB 1422 ms //划分树 #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]; //val int num[imax_n]; //num long long sum[imax_n]; //sum }f[]; int a[imax_n]; int sorted[imax_n]; 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].sum[i]=; f[t].num[i]=; } else { f[t].sum[i]=f[t].sum[i-]; f[t].num[i]=f[t].num[i-]; } if (f[t].val[i]<sorted[mid]) { f[t].num[i]++; f[t].sum[i]+=f[t].val[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 (same<isame) { same++; f[t].num[i]++; f[t].sum[i]+=f[t].val[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,b1,b2; ; long long tsum; if (a==l) { s=f[t].num[b]; ss=; tsum=f[t].sum[b]; } else { s=f[t].num[b]-f[t].num[a-]; ss=f[t].num[a-]; tsum=f[t].sum[b]-f[t].sum[a-]; } if (s>=k) //当前查找区间[a,b]里包含的小于t=sorted[(left+right)/2]的数大于k个,则当前区间第k大的数 { //被分到[l,r]的左孩子,区间更新为[left+num[a-1],left+num[b]-1], a=l+ss; //left--a-1 中包含num[a-1]个比t小的数,则[a,b]区间比t小的数,一定在left+num[a-1]后面 b=l+ss+s-;; //left--b 中一共包含了num[b]个比t小的数,则[a,b]区间中比t小的数的最大位置在left+num[b]-1 ,l,mid,a,b,k); } else { //当前查找区间[a,b]中小于t=sorted[(left+right)/2]的数的个数小于k个,则当前区间第k大的数 b1=a-l-ss; //被分到[l,r]的右孩子,区间更新为[mid+1+a-1-left-num[a-1]+1,mid+1+b-left-sum[b]] b2=b-a+-s; //即[mid+1+a-left-num[a-1],mid+1+b-left-sum[b]] a=mid+b1+; //因为left--a-1 分入左孩子的个数为num[a-1],所以分入右孩子的个数为r1=a-1-left+1-num[a-1] b=mid+b1+b2; //映射在右区间的开始位置是:mid+1+r1-1=mid+1+a-left-num[a-1] sum+=tsum; //left--b 分入左孩子的个数为num[b] ,分入右孩子的个数就是b-left+1-num[b] ,mid+,r,a,b,k-s); //映射到右区间得:mid+1+b-left+1-num[b]-1=mid+1+b-left-num[b] } } int n,m; int x,y,k; void slove() { build(,,n); ;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); ,,n,x,y,k); printf("%d\n",t); } } int main() { while (scanf("%d%d",&n,&m)!=EOF) { ;i<=n;i++) { scanf("%d",&a[i]); f[].val[i]=sorted[i]=a[i]; } sort(sorted+,sorted+n+); slove(); } ; }
poj2104 线段树 划分树的更多相关文章
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- POJ2104 k-th number 划分树
又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- hdu3473 线段树 划分树
//Accepted 28904 KB 781 ms //划分树 //所求x即为l,r区间排序后的中位数t //然后求出小于t的数的和sum1,这个可以用划分树做 //求出整个区间的和sum,可以用O ...
- POJ 题目2761 Feed the dogs(主席树||划分树)
Feed the dogs Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 16860 Accepted: 5273 De ...
- POJ2104 K-th Number 划分树 模板题啊
/*Source Code Problem: 2104 User: 96655 Memory: 14808K Time: 1282MS Language: G++ Result: Accepted S ...
- poj2104 K大数 划分树
题意:给定一个数列,求一个区间的第K大数 模板题, 其中的newl, newr 有点不明白. #include <iostream> #include <algorithm> ...
- 初学划分树,小见解之!POJ-2104/HDU-2665
划分树 本来是学主席树的,可怜我等巨弱观群巨博客难解fotle主席的思想精髓.于是学了一下划分树,嗯,花了一下午时间理解build(其实自己模拟一遍就通了),我很难理解为什么划分树会看不懂而能学会主席 ...
- 划分树 poj2104 hdu5249
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
随机推荐
- Canu Parameter Reference(canu参数介绍)
链接:Canu Parameter Reference To get the most up-to-date options, run canu -options The default values ...
- 安卓App热补丁动态修复技术介绍
版权声明:本文由johncz原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/169 来源:腾云阁 https://www.q ...
- MM--发票校验 及基于采购订单的MIRO发票校验过程(
一.介绍发票校验是物料管理(MM)系统的一部分.它提供物料管理部分和财务会计, 成本控制和资产管理部分的连接.物料管理模块的发票校验为以下目的服务:它完成物料采购的全过程 - 物料采购从采购申请开始, ...
- stream流批量读取并合并文件
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- 为学Linux 我看了这些书
去年开始,抱着学习的态度开始了我的Linux学习,到现在,差不多一年了,收获很多,不敢说精通Linux,但是,还是对得起“略懂”这两个字的.这一年里我看了很多书,细细数下,大概15本左右,其中包含了两 ...
- 转 http://www.5icool.org/a/201106/a654.html CSS开发中常用的公用样式
overflow:hidden 隐藏溢出 一.自己总结的公用样式解析 html, body, div, p, ul, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, f ...
- hdu---(1280)前m大的数(计数排序)
前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 报错总结_java.lang.RuntimeException: Invalid action class configuration that references an unknown class name
在使用SSH进行项目开发时,一不小心就可能出现以上的错误提示. 这样的问题可以简单理解为未找到名字为XXX的action 1)xxxAction没有在Struts.xml中配置相应的action: 大 ...
- MASM6.15汇编程序例子
/***************通过调用(INT 21H)表中的01h号功能号从键盘输入一个字符并回显到视频显示器上*****************/ DATAS SEGMENT ;此处输入数据段代 ...
- MySQL数据库百万级高并发网站实战
在一开始接触PHP接触MYSQL的时候就听不少人说:“MySQL就跑跑一天几十万IP的小站还可以,要是几百万IP就不行了”,原话不记得了,大体 就是这个意思.一直也没有好的机会去验证这个说法,一是从没 ...