BZOJ 3524主席树裸题 (雾)
2017-01-07 10:59
375 查看
思路:
按权值建一棵主席树
(但是这好像不是正解 空间复杂度是不对的…….)
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 555555 int n,m,cnt,root ,a ,xx,yy; struct Tree{int l,r,num;}tree[N*20]; void push_up(int pos){tree[pos].num=tree[tree[pos].l].num+tree[tree[pos].r].num;} int build(int l,int r){ int pos=++cnt; if(l==r){return pos;} int mid=(l+r)>>1; tree[pos].l=build(l,mid),tree[pos].r=build(mid+1,r); return pos; } int insert(int o,int l,int r,int num){ int pos=++cnt;tree[pos]=tree[o]; if(l==r){tree[pos].num++;return pos;} int mid=(l+r)>>1; if(num<=mid)tree[pos].l=insert(tree[o].l,l,mid,num); else tree[pos].r=insert(tree[o].r,mid+1,r,num); push_up(pos); return pos; } int query(int o,int v,int l,int r,int wei){ if(tree[o].num-tree[v].num<=wei)return 0; if(l==r)return l; int mid=(l+r)>>1; if(tree[tree[o].l].num-tree[tree[v].l].num>wei) return query(tree[o].l,tree[v].l,l,mid,wei); else return query(tree[o].r,tree[v].r,mid+1,r,wei); } int main(){ scanf("%d%d",&n,&m); root[0]=build(1,n); for(int i=1;i<=n;i++)scanf("%d",&a[i]),root[i]=insert(root[i-1],1,n,a[i]); for(int i=1;i<=m;i++){ scanf("%d%d",&xx,&yy); printf("%d\n",query(root[yy],root[xx-1],1,n,(yy-xx+1)/2)); } }
相关文章推荐
- angular2学习--根模块
- 自定义控件 随着手滑动DrawView
- eclipse下运行EasyAR官方sample的方法
- Qt程序调试之Q_ASSERT断言
- 电脑远程桌面连接设置【申明:来源于网络】
- Android先执行线程池后执行主线程
- Maven创建工程 WEB
- jQuery日程管理插件fullcalendar使用详解
- 【蓝桥杯】试题集入门训练第三题
- centos7建站操作步骤
- Codeforces Round #390 (Div. 2)(A+B)
- 旋转矩阵
- new beginning
- 空对象模式
- nginx php-fpm 输出php错误日志
- Mybatis Generator 生成的mapper只有insert方法
- OpenCV进阶之路:一个简化的视频摘要程序
- cmd/bat如何自动请求管理员权限而不需要右键管理员运行
- HTTP协议详解
- 孪生素数问题