博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树
阅读量:5982 次
发布时间:2019-06-20

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

主席树模板题目

#include
using namespace std;int root[500010],a[500010],hash[500010],dd,n,m,len=0,sum[15000000],l[15000000],r[15000000];int maketree(int L,int R){ int rt=++len; sum[rt]=0; if(L
>1; l[rt]=maketree(L,mid); r[rt]=maketree(mid+1,R); } return rt;}int update(int pre,int L,int R,int x){ int rt=++len; l[rt]=l[pre]; r[rt]=r[pre]; sum[rt]=sum[pre]+1; if(L
>1; if(x<=mid)l[rt]=update(l[pre],L,mid,x); else r[rt]=update(r[pre],mid+1,R,x); } return rt;}int query(int x,int y,int L,int R,int X){ if(L>=R) { if(sum[y]-sum[x]>X)return L; else return 0; } int sum1=sum[l[y]]-sum[l[x]],sum2=sum[r[y]]-sum[r[x]]; int mid=(L+R)>>1; if(sum1>X)return query(l[x],l[y],L,mid,X); else if(sum2>X)return query(r[x],r[y],mid+1,R,X); else return 0;}int main(){ //freopen("xf.in","r",stdin); //freopen("xf.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); hash[i]=a[i]; } sort(hash+1,hash+n+1); dd=unique(hash+1,hash+n+1)-hash-1; root[0]=maketree(1,dd); for(int i=1;i<=n;i++) { int x=lower_bound(hash+1,hash+dd+1,a[i])-hash; root[i]=update(root[i-1],1,dd,x); } int x,y; while(m--) { scanf("%d%d",&x,&y); int ans=query(root[x-1],root[y],1,dd,(y-x+1)/2); printf("%d\n",hash[ans]); } return 0;}

  

#include
using namespace std;int w,root[500010],a[500010],hash[500010],dd,n,m,len=0,sum[15000000],l[15000000],r[15000000];int maketree(int L,int R){ int rt=++len; sum[rt]=0; if(L
>1; l[rt]=maketree(L,mid); r[rt]=maketree(mid+1,R); } return rt;}int update(int pre,int L,int R,int x){ int rt=++len; l[rt]=l[pre]; r[rt]=r[pre]; sum[rt]=sum[pre]+1; if(L
>1; if(x<=mid)l[rt]=update(l[pre],L,mid,x); else r[rt]=update(r[pre],mid+1,R,x); } return rt;}int query(int x,int y,int L,int R,int X){ if(L>=R) { if(sum[y]-sum[x]>X)return L; else return 0; } int sum1=sum[l[y]]-sum[l[x]],sum2=sum[r[y]]-sum[r[x]]; int mid=(L+R)>>1; if(sum1>X)return query(l[x],l[y],L,mid,X); else if(sum2>X)return query(r[x],r[y],mid+1,R,X); else return 0;}int main(){ //freopen("xf.in","r",stdin); //freopen("xf.out","w",stdout); scanf("%d%d",&n,&w); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); hash[i]=a[i]; } scanf("%d",&m); sort(hash+1,hash+n+1); dd=unique(hash+1,hash+n+1)-hash-1; root[0]=maketree(1,dd); for(int i=1;i<=n;i++) { int x=lower_bound(hash+1,hash+dd+1,a[i])-hash; root[i]=update(root[i-1],1,dd,x); } int x,y; while(m--) { scanf("%d%d",&x,&y); int ans=query(root[x-1],root[y],1,dd,(y-x+1)/2); if(ans==0)printf("no\n"); else printf("yes %d\n",hash[ans]); } return 0;}

  

转载于:https://www.cnblogs.com/mybing/p/8550263.html

你可能感兴趣的文章
卓尔入股兰亭集势 深刻改变中国电商格局
查看>>
linux运维实战练习-2015年8月30日课程作业(练习)安排
查看>>
Powershell-Exchange:如何确认exchange的小版本号
查看>>
超越执行力的《知道力》热烈发售中。。。朋友们,给力啦!!!
查看>>
程序员技术练级攻略
查看>>
MySQL5.6更人性化修改redo log事务日志文件大小
查看>>
SonataEasyExtendsBundle功能包:安装
查看>>
【VMCloud云平台进阶篇】应用数据层面优化(一)
查看>>
MBR与GPT分区表
查看>>
深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
查看>>
电商黑马!揭秘拼多多日销千单新品活动玩法
查看>>
Linux下搭建JSP环境
查看>>
用ipad维护Linux服务器
查看>>
Windows勒索病毒防范、解决方法全攻略
查看>>
传统PC与虚拟桌面在管理维护上的对比
查看>>
TCP长连接与短连接的区别
查看>>
我的运维心得分享
查看>>
C51中~XBYTE 简介
查看>>
关于Memcache mutex设计模式的.net实现
查看>>
poj3067
查看>>