poj 2104 分类: poj 2015-02-09 23:23 91人阅读 评论(0) 收藏
2015-02-09 23:23
429 查看
poj2104
今天研究了一下函数式线段树(主席树),感觉很厉害呀!
主席树,其意义是对每序列中每个元素都建一棵子树,来描述前i个元素的信息
直接建树的话,时间、空间都是N∗N∗logN ,肯定会MLE/TLE
记Tree(i)为描述1~i的线段树
Tree(i)与Tree(i−1)会有很多公共的信息,所以只有logN条新增信息
所以建树Tree(i)时,可以和Tree(i−1)共用一些节点,其余只需新增logN个节点
初始化Tree(0):建一棵空树
时间复杂度O(N∗logN)
空间复杂度O(N∗logN)
主席树空间计算:SIZE=N∗logN+3∗N
具体参见fhq神犇的:《范浩强_wc2012谈谈各种数据结构》
对于这个题,我除了写主席树就没动什么脑子,线段树代码直接敲,有些乱搞倾向。。。
tree(i)描述整个序列中 1~i小的元素在树中的分布情况
然后二分答案,l和r,满足 count[i,j,tree(l)]<k<=count[i,j,tree(r)]
最后结果:ans=value(r) ,其实还是写长了。。。
时间复杂度(N∗logN+M∗logN)
UPD:^_^,然而,最后我发现,我的主席树映射写反了233333,难怪代码这么长。。。
今天研究了一下函数式线段树(主席树),感觉很厉害呀!
主席树,其意义是对每序列中每个元素都建一棵子树,来描述前i个元素的信息
直接建树的话,时间、空间都是N∗N∗logN ,肯定会MLE/TLE
记Tree(i)为描述1~i的线段树
Tree(i)与Tree(i−1)会有很多公共的信息,所以只有logN条新增信息
所以建树Tree(i)时,可以和Tree(i−1)共用一些节点,其余只需新增logN个节点
初始化Tree(0):建一棵空树
时间复杂度O(N∗logN)
空间复杂度O(N∗logN)
主席树空间计算:SIZE=N∗logN+3∗N
具体参见fhq神犇的:《范浩强_wc2012谈谈各种数据结构》
对于这个题,我除了写主席树就没动什么脑子,线段树代码直接敲,有些乱搞倾向。。。
tree(i)描述整个序列中 1~i小的元素在树中的分布情况
然后二分答案,l和r,满足 count[i,j,tree(l)]<k<=count[i,j,tree(r)]
最后结果:ans=value(r) ,其实还是写长了。。。
时间复杂度(N∗logN+M∗logN)
UPD:^_^,然而,最后我发现,我的主席树映射写反了233333,难怪代码这么长。。。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<math.h> #define SIZE 2000000 #define MAXN 100005 int n,m; struct node{int l,r,c[2],cnt;}mp[SIZE]={0}; int ml=0,root[MAXN]={0}; int a[MAXN]={0},rank[MAXN]={0},v[MAXN]={0},swap; int ll,rr,ki; int buildtree0(int l0,int r0) { int ret=++ml,mid=(l0+r0)>>1; mp[ret].l=l0,mp[ret].r=r0; if(l0==r0)return ret; if(l0<=mid) mp[ret].c[0]=buildtree0(l0,mid); if(mid+1<=r0)mp[ret].c[1]=buildtree0(mid+1,r0); return ret; } int buildtree(int rt,int xi) { int mid=(mp[rt].l+mp[rt].r)>>1; int ret=++ml,tag; mp[ret].l=mp[rt].l; mp[ret].r=mp[rt].r; if(mp[rt].l==mp[rt].r) { mp[ret].c[0]=mp[ret].c[1]=0; mp[ret].cnt=1; return ret; } /* if(xi<=mid) { mp[ret].c[0]=buildtree(mp[rt].c[0],xi); mp[ret].c[1]=mp[rt].c[1]; } else { mp[ret].c[0]=mp[rt].c[0]; mp[ret].c[1]=buildtree(mp[rt].c[1],xi); } */ tag=(xi<=mid); mp[ret].c[tag]=mp[rt].c[tag]; mp[ret].c[tag^1]=buildtree(mp[rt].c[tag^1],xi); mp[ret].cnt=mp[mp[ret].c[0]].cnt+mp[mp[ret].c[1]].cnt; return ret; } void sort(int l,int r) { int i=l,j=r; int t=a[rank[l+rand()%(r-l+1)]]; while(i<=j) { while(a[rank[i]]<t)i++; while(a[rank[j]]>t)j--; if(i<=j) { swap=rank[i]; rank[i]=rank[j]; rank[j]=swap; i++,j--; } } if(l<j)sort(l,j); if(i<r)sort(i,r); } int count(int s,int l,int r) { int mid=(mp[s].l+mp[s].r)>>1; if(mp[s].l==l && mp[s].r==r)return mp[s].cnt; if(r<=mid) { return count(mp[s].c[0],l,r); } else if(l>=mid+1) { return count(mp[s].c[1],l,r); } else { return count(mp[s].c[0],l,mid)+count(mp[s].c[1],mid+1,r); } } int getnum(); int main() { int i,l,r,mid; #ifndef ONLINE_JUDGE freopen("poj2104.in","r",stdin); freopen("poj2104.out","w",stdout); #endif srand(time(NULL)); n=getnum();m=getnum(); for(i=1;i<=n;i++) rank[i]=i,a[i]=getnum(); if(n!=1)sort(1,n); for(i=1;i<=n;i++) { v[rank[i]]=i; } root[0]=buildtree0(1,n); for(i=1;i<=n;i++) { root[i]=buildtree(root[i-1],rank[i]); } while(m--) { ll=getnum(); rr=getnum(); ki=getnum(); l=1;r=n; if(count(root[l],ll,rr)>=ki) printf("%d\n",a[rank[l]]); else { while(l+1!=r) { mid=(l+r)>>1; if(count(root[mid],ll,rr)>=ki) r=mid; else l=mid; } printf("%d\n",a[rank[r]]); } } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; } char str[20],sl;int gi,gret,cq; int getnum() { gret=0; scanf("%s",str); sl=strlen(str); if(str[0]=='-')cq=-1,gi=1; else cq=1,gi=0; for(;gi<sl;gi++) { gret*=10; gret+=str[gi]-'0'; } return gret*cq; }
相关文章推荐
- HttpClient基础教程 分类: C_OHTERS 2014-05-18 23:23 2600人阅读 评论(0) 收藏
- 十进制与任意进制的转换 分类: 编程 2014-12-25 21:45 91人阅读 评论(0) 收藏
- xml解析 分类: Cocos2d-x 2015-02-09 18:23 127人阅读 评论(0) 收藏
- poj 2777 分类: poj templates 2015-03-30 22:15 29人阅读 评论(0) 收藏
- poj 3686 分类: poj templates 2015-03-26 22:29 46人阅读 评论(0) 收藏
- Android SDK开发包国内下载地址 分类: Android开发 2014-05-30 10:52 91人阅读 评论(0) 收藏
- Poj 1032 分类: Translation Mode 2014-04-04 09:09 111人阅读 评论(0) 收藏
- poj 2828 分类: poj 2015-03-06 21:49 38人阅读 评论(0) 收藏
- poj 2155 分类: poj templates 2015-03-30 17:34 37人阅读 评论(0) 收藏
- poj 3481 分类: poj 2015-03-07 20:19 218人阅读 评论(2) 收藏
- CCArray 分类: Cocos2d-x 2015-02-09 18:21 116人阅读 评论(0) 收藏
- cocos2d::Vector 分类: Cocos2d-x 2015-02-09 18:18 127人阅读 评论(0) 收藏
- sgu 111 分类: sgu 2015-02-09 14:35 123人阅读 评论(0) 收藏
- BootStrap-CSS选项列表大全 分类: 前端 2015-02-09 21:24 122人阅读 评论(0) 收藏
- Poj 1029 分类: Translation Mode 2014-04-04 10:18 112人阅读 评论(0) 收藏
- Poj 2559 最大矩形面积 v单调栈 分类: Brush Mode 2014-11-13 20:48 81人阅读 评论(0) 收藏
- Overview 分类: Cocos2d-x 2015-02-09 18:16 98人阅读 评论(0) 收藏
- ClippingNode的使用 分类: ios开发 Cocos2d-x 2015-02-09 18:17 112人阅读 评论(0) 收藏
- CCDictionary 分类: Cocos2d-x 2015-02-09 18:22 109人阅读 评论(0) 收藏
- cocos2d::Value 分类: Cocos2d-x 2015-02-09 18:20 112人阅读 评论(0) 收藏