BZOJ 3110, K大数查询
来源:互联网 发布:天刀少女脸型数据 编辑:程序博客网 时间:2024/06/17 17:45
Problem
传送门
Mean
要求维护一个数列,支持在某部分的每个位置填上一个数以及查询某部分第K大的数字。
Analysis
终于学习了一下树套树的姿势……其实和自己想的也差不多……但是不学还是打不出代码来……
外层是权值线段树,内层是区间线段树。
要注意的细节比较多。二分查询过程中结果可能超过 Maxlongint
,需要用 unsigned int
类型传递;权值可以翻转后整体右移等等。
但最主要的还是实现树套树啦~~~
Code
#include<cstdio>const int N=50000,L=100001,M=16000005;int n,m,cmd,a,b,c,cnt,root[M],ls[M],rs[M];unsigned int sum[M],tag[M];void read(int &x){ char c; bool p=0; while((c=getchar())<'0' || c>'9') if(c=='-') p=1; x=c-'0'; while((c=getchar())>='0' && c<='9') x=x*10+c-'0'; if(p) x=-x;}void down(int o,int l,int r){ if(!ls[o]) ls[o]=++cnt; if(!rs[o]) rs[o]=++cnt; int mid=l+r>>1; tag[ls[o]]+=tag[o],tag[rs[o]]+=tag[o]; sum[ls[o]]+=(mid-l+1)*tag[o],sum[rs[o]]+=(r-mid)*tag[o]; tag[o]=0;}void modify(int &o,int l,int r,int ql,int qr){ if(!o) o=++cnt; if(tag[o] && l<r) down(o,l,r); if(ql==l && r==qr){ sum[o]+=r-l+1; tag[o]++; return; } int mid=l+r>>1; if(qr<=mid) modify(ls[o],l,mid,ql,qr); else if(ql>mid) modify(rs[o],mid+1,r,ql,qr); else{ modify(ls[o],l,mid,ql,mid); modify(rs[o],mid+1,r,mid+1,qr); } sum[o]=sum[ls[o]]+sum[rs[o]];}void insert(int o,int l,int r,int a,int b,int q){ while(l<r){ int mid=l+r>>1; modify(root[o],1,n,a,b); if(q<=mid) r=mid,o<<=1; else l=mid+1,o=o<<1|1; } modify(root[o],1,n,a,b);}unsigned int find(int o,int l,int r,int ql,int qr){ if(!o) return 0; if(l==ql && r==qr) return sum[o]; if(tag[o]) down(o,l,r); int mid=l+r>>1; if(qr<=mid) return find(ls[o],l,mid,ql,qr); if(ql>mid) return find(rs[o],mid+1,r,ql,qr); return find(ls[o],l,mid,ql,mid)+find(rs[o],mid+1,r,mid+1,qr);}int query(int o,int l,int r,int a,int b,unsigned int c){ while(l<r){ int mid=l+r>>1; unsigned int t=find(root[o<<1],1,n,a,b); if(t<c) l=mid+1,c-=t,o=o<<1|1; else r=mid,o<<=1; } return l;}int main(){ read(n),read(m); while(m--){ read(cmd),read(a),read(b),read(c); if(cmd==1) insert(1,1,L,a,b,N-c+1); else printf("%d\n",N+1-query(1,1,L,a,b,c)); } return 0;}
0 0
- bzoj-3110 K大数查询
- BZOJ 3110, K大数查询
- BZOJ 3110 ZJOI2013 K大数查询 树套树
- BZOJ-3110-K大数查询-ZJOI2013-暴力
- 【BZOJ 3110】【ZJOI 2013】K大数查询
- BZOJ 3110 K大数查询 树套树
- bzoj 3110 [Zjoi2013]K大数查询
- BZOJ 3110 [Zjoi2013]K大数查询
- 【bzoj 3110】[Zjoi2013]K大数查询|树套树
- BZOJ 3110 [Zjoi2013]K大数查询
- bzoj 3110 K大数查询(树套树)
- bzoj 3110 K大数查询(整体二分)
- 【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
- bzoj 3110 K大数查询 整体二分
- 【BZOJ 3110】【ZJOI 2013】K大数查询
- [BZOJ]3110: [Zjoi2013]K大数查询
- BZOJ 3110 (zjoi 2013)k大数查询(树套树)
- BZOJ-3110-K大数查询-ZJOI2013-整体二分
- Android Studio问题收集贴
- Android Activity的构造方法
- poj 3160 Father Christmas flymouse(强连通缩点+最长路)
- php 生成ics文件
- Vuex 快速入门
- BZOJ 3110, K大数查询
- Oracle动态执行表不可访问
- BZOJ 1109: [POI2007]堆积木Klo 神分析, LIS, BIT, 二分
- Vue.js学习系列一 —— vue-router2学习实践笔记(附DEMO)
- Storm的安装步骤
- linux系统批量挂载磁盘(磁盘大于2T)
- [Java]注解
- Android Service完全解析,关于服务你所需知道的一切(上)
- Android实现自定义广播