[BZOJ3110]K大数查询|线段树套线段树
来源:互联网 发布:网页美工和前端工作 编辑:程序博客网 时间:2024/06/10 07:58
妈呀这题好神好神好神。。我发现主席树好像做不了呀。。咋全写的是线段树套线段树呢。。后来还是看黄学长的代码看懂了。。果然我是看黄学长博客长大的。。有两种做法,大部分人是外层权值线段树,内层区间线段树,这个我写了,还是很好写。。lyd给了一种外层区间内层权值的做法,没看懂。。内层区间[l1,r1]在外层权值区间[l,r]下的意义是在[l1,r1]内有多少权值在[l,r]之间的数。。由于一开始是空的,每次最多访问nlog^2 n个节点,所以我们用实时开点,空间复杂度O(nlog^2 n)。。具体的还是好好看代码。。
#include<iostream>#include<cstdio>#define N 200005using namespace std;int n,m,opt,a,b,c,i,nd=0,root[N],lc[100*N],rc[100*N],sum[100*N],tag[100*N];void mark(int &x,int l,int r,int c){if (!x) x=++nd,lc[x]=rc[x]=tag[x]=sum[x]=0;tag[x]+=c;sum[x]+=c*(r-l+1);}void down(int x,int l,int r){if (!tag[x]||l==r) return;mark(lc[x],l,(l+r)>>1,tag[x]);mark(rc[x],((l+r)>>1)+1,r,tag[x]);tag[x]=0;}void update(int &x,int l,int r,int a,int b){if (!x) x=++nd,lc[x]=rc[x]=tag[x]=sum[x]=0;down(x,l,r);if (l==a&&r==b){tag[x]++;sum[x]+=b-a+1;return;}int mid=(l+r)>>1;if (b<=mid) update(lc[x],l,mid,a,b);else if (a>mid) update(rc[x],mid+1,r,a,b);else update(lc[x],l,mid,a,mid),update(rc[x],mid+1,r,mid+1,b);sum[x]=sum[lc[x]]+sum[rc[x]];}void insert(int a,int b,int c){int now=1,l=1,r=n,mid;while (l<r){update(root[now],1,n,a,b);mid=(l+r)>>1;now<<=1;if (c<=mid) r=mid; else l=mid+1,now+=1;}update(root[now],1,n,a,b);}int query(int x,int l,int r,int a,int b){if (!x) return 0;down(x,l,r);if (l==a&&r==b) return sum[x];int mid=(l+r)>>1;if (b<=mid) return query(lc[x],l,mid,a,b);else if (a>mid) return query(rc[x],mid+1,r,a,b);else return query(lc[x],l,mid,a,mid)+query(rc[x],mid+1,r,mid+1,b);}int solve(int a,int b,int k){int now=1,l=1,r=n,mid,s;while (l<r){int mid=(l+r)>>1;now<<=1;s=query(root[now],1,n,a,b);if (s>=k) r=mid;else l=mid+1,now++,k-=s;}return l;}int main(){freopen("3110.in","r",stdin);freopen("3110.out","w",stdout);scanf("%d%d",&n,&m);for (i=1;i<=N-1;i++) root[i]=0;while (m--){scanf("%d%d%d%d",&opt,&a,&b,&c);if (opt==1) insert(a,b,n-c+1);else printf("%d\n",n-solve(a,b,c)+1);}}
0 0
- [BZOJ3110]K大数查询|线段树套线段树
- bzoj3110[Zjoi2013]K大数查询 主席树套线段树
- 【BZOJ3110】【Zjoi2013】K大数查询 树套树 权值线段树套区间线段树
- 【线段树套线段树】[ZJOI 2013] bzoj3110 K大数查询
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
- 【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树
- 【bzoj3110】【ZJOI2013】【K大数查询】【权值线段树套位置线段树】
- [BZOJ3110][ZJOI2013]K大数查询(线段树套线段树)
- [BZOJ3110][Zjoi2013]K大数查询(主席树套线段树||整体二分 )
- 【BZOJ3110】K大数查询(ZJOI2013)-整体二分+线段树
- bzoj3110 K大数查询(整体二分+线段树)
- BSOJ3723:ZJOI2013 k大数查询 线段树套线段树
- 【ZJOI2013】K 大数查询 ( 树状数组套线段树 )
- K大数查询——整体二分套线段树
- BZOJ3110 K大数查询 【线段树 + 整体二分 或 树套树(非正解)】
- BZOJ 3110(ZJOI K大数查询-线段树套线段树)
- BZOJ 3110: [Zjoi2013]K大数查询|线段树套线段树
- 3110: [Zjoi2013]K大数查询 线段树套线段树 标记永久化
- 信号与系统
- PHP语言实现脚本异步执行
- 抽象工厂模式(三):抽象工厂模式概述
- C#身份证验证
- 第14题
- [BZOJ3110]K大数查询|线段树套线段树
- 《机器学习》学习笔记(三):支持向量机(SVM)
- zoj 3605 Find the Marble 计数dp
- hex文件转换为bin文件C语言实现
- [BZOJ3172]TJOI2013单词|AC自动机
- [linux0001]How to fix /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
- c实现:2月29日
- 关于实现微信JSSDK的错误分析
- 阿里笔试部分题目分析(2015实习生 C/C++研发)