【线段树专题】poj2104
来源:互联网 发布:淘宝 实木家具 编辑:程序博客网 时间:2024/05/18 00:58
这个题已经被花式A了
因为要练习线段树,所以就用函数式线段树写了这个题,
函数式运用了一种可持久化的思想,在修改的同时记录修改以前的样子,
函数式线段树的话就是在每次进行插入操作的时候在上一次线段树的基础上新建一条路径,其余节点都用原来线段树的节点
感觉现在写起来比以前要轻松很多了。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;int root[200100],a[200100],b[200100],tot,n,q,tail;struct rec{ int l,r,lch,rch,sum;}tree[4001000];void maketree(int l,int r){ int now=++tot; tree[now].l=l; tree[now].r=r; if (l==r) return; int mid=(l+r)>>1; tree[now].lch=tot+1;maketree(l,mid); tree[now].rch=tot+1;maketree(mid+1,r);}void insert(int x1,int x2,int w){ int now=++tot; tree[tot].sum=tree[x1].sum; tree[tot].l=tree[x1].l; tree[tot].r=tree[x1].r; tree[tot].lch=tree[x1].lch; tree[tot].rch=tree[x1].rch; if (tree[tot].l==tree[tot].r) { tree[tot].sum++; return; } int mid=(tree[x1].l+tree[x1].r)>>1; if (w<=mid) { tree[tot].lch=tot+1; insert(tree[x1].lch,tot+1,w); } else { tree[tot].rch=tot+1; insert(tree[x1].rch,tot+1,w); } tree[now].sum++;}int find_ans(int x1,int x2,int k){ if (tree[x1].l==tree[x1].r) return a[tree[x1].l]; if (tree[tree[x2].lch].sum-tree[tree[x1].lch].sum>=k) return find_ans(tree[x1].lch,tree[x2].lch,k); else return find_ans(tree[x1].rch,tree[x2].rch,k-(tree[tree[x2].lch].sum-tree[tree[x1].lch].sum));}int main(){ freopen("poj2104.in","r",stdin); tot=0; scanf("%d%d",&n,&q); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } sort(a+1,a+n+1); tail=unique(a+1,a+n+1)-a-1; maketree(1,tail); root[0]=1; int w; for (int i=1;i<=n;i++) { root[i]=tot+1; w=lower_bound(a+1,a+tail+1,b[i])-a; insert(root[i-1],root[i],w); } int l,r,k,ans; for (int i=1;i<=q;i++) { scanf("%d%d%d",&l,&r,&k); ans=find_ans(root[l-1],root[r],k); printf("%d\n",ans); }}
0 1
- 【线段树专题】poj2104
- 线段树基础 poj2104
- poj2104 线段树+二分搜索
- poj2104(函数式线段树/主席树)
- 可持久化线段树(poj2104/hdu4866)
- poj2104 K-th Number (线段树实现)
- POJ2104 K-th Number 【线段树+二分】
- Hustoj (poj2104)线段树(划分树)
- 可持久化数据结构之线段树 hdu2665 poj2104
- poj2104 K-th Number (函数式线段树)
- hdu2665 poj2104 可持久化数据结构之线段树
- poj2104 (线段树求区间第k大)
- 185_K-th NUmber 线段树 (POJ2104)
- poj2104 K-th Number 离散+可持久化线段树
- 区间第k小 poj2104 可持久化线段树
- 线段树专题介绍
- 线段树专题
- 【专题属性】线段树
- DTO的应用
- ubuntu14.04 apache修改网站根目录以及默认网页
- javascript中的平稳退化
- T001_UT001_0007
- poj 2887 块状数组/线段树
- 【线段树专题】poj2104
- Ubuntu常见命令记录
- mdk工具关键字的定义。
- GitHub傻瓜式教程(一、创建仓库)
- T001_UT001_0008
- 程序员解决问题的60个策略
- 3
- Java包命名规则引发的思考
- leetcode:Divide Two Integers