博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的划分树(详细 注解)
阅读量:4130 次
发布时间:2019-05-25

本文共 2080 字,大约阅读时间需要 6 分钟。

//题目链接:<a href="http://acm.hdu.edu.cn/showproblem.php?pid=4251">http://acm.hdu.edu.cn/showproblem.php?pid=4251</a>
/*
hdu 4251 The Famous ICPC Team Again
别人的代码:(我自己的注解)
注解提供者:GHQ(SpringWater)
自己理解:划分树的思想是将序列按大小,二分位log2(n)层,每一层的信息放在t[d].val[i],(同一层的各部分共享一个val[N])中,用t[d].name[i]记录l到i位置中有多少个
数字划分到左边,算了,还是直接在下面关键部位注释详实一点吧,太难写了!
*/#include
#include
using namespace std; const int N=100010;int srted[N];struct node{ int num[N]; // 记录从l到i中有多少个划分到左子树去了 int val[N]; //记录由上一层划分到下一层中重新排列的数字序列(可能里面有多个[l,r]部分,每个部分按其最初的前后顺序排列,但不一定是升序或降序)}t[20];//20=log2(N)int n,m;void build(int l,int r,int d)//建树 此树并非由节点构成 而是由数组的一段构成 如:d层的l~r是一个节点 { if(l==r) return; //只有一个元素,不能继续划分到两个区间了 int mid=(l+r)>>1;//取中间那个 int midd=srted[mid]; //之前我以为每次 都要从新排序来求这个中位值,后来一想其实最先 排好序的srted【i】,已经得出了每一区间的排序结果, //可以直接取[l,r]中位值可获得 int same=mid-l+1,samed=0,zn=l-1,yn=mid,i;//same初识化为左孩子元素个数 //下面减去比midd小的(一定会进入左孩子里边) 剩下的就是==midd并且要进入左孩子的个数 //samed是已经插入的数目 //zn、yn是左右孩子的开始位置-1,下面会把元素分到两个孩子的区域里边 for(i=l;i<=r;++i) if(t[d].val[i]
midd)//进入右孩子 { t[d+1].val[++yn]=t[d].val[i]; //yn的初始值为右边界(mid),当划分一个进右边,++yn }else { if(samed
>1; int sx=t[d].num[a-1],sy=t[d].num[b]; //sy-sx为[a,b]区间中有多少个划分到左边 if(a-1
=k)//[a,b]进入左子树的元素>=k return query(l+sx,l+sy-1,k,l,mid,d+1); else { int s1=(a==1?0:a-l-sx); //s1为l到a-1中有多少个划分到右子树,因为a-l为l到a-1的序列个数,减去划分到左边的个数,就为右边的个数了! int s2=(b-a+1)-(sy-sx); [a,b]中划分到右边的个数,b-a+1为[a,b]区间的总数,(sy-sx)为[a,b]区间中划分到左边的个数 //所以总数减去划分到左边的个数极为划分到右边的个数! int nk=k-(sy-sx);//前(sy-sx)大的元素在左子树里 剩下的在右子树里边找 return query(mid+1+s1,mid+s1+s2,nk,mid+1,r,d+1); //[mid+1,mid+s1]为[l,a-1]区间划分到右边的数字序列, //[mid+1+s1,mid+s1+s2]即为[a,b]区间划分到有子树的数字序列 }}int main(){ int cas=1; int i,a,b; while(cin>>n) { cout<<"Case "<
<<":"<
>srted[i]; t[0].val[i]=srted[i]; } sort(srted+1,srted+1+n); build(1,n,0); cin>>m; for(i=1;i<=m;++i) { cin>>a>>b; cout<

转载地址:http://shuvi.baihongyu.com/

你可能感兴趣的文章
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
JAVA数据类型
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>