【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
来源:互联网 发布:vb入门教学视频 编辑:程序博客网 时间:2024/05/23 01:57
权值线段树套区间线段树
外层线段树按照完全二叉树的建法全部建出
内层线段树动态开点
外层的每个节点上都建一棵区间线段树,维护权值在[l,r]中每个区间出现的个数
每次修改对应外层线段树上的O(log n)个节点,内层修改一个区间,对应内层线段树上的O(log n)个节点
外层线段树按照完全二叉树的建法全部建出
内层线段树动态开点
外层的每个节点上都建一棵区间线段树,维护权值在[l,r]中每个区间出现的个数
每次修改对应外层线段树上的O(log n)个节点,内层修改一个区间,对应内层线段树上的O(log n)个节点
所以,一次修改会修改O(log^2 n)个节点
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<iostream>#define maxn 50010#define N 20000100using namespace std;struct yts{int lch,rch;long long tag,sum;}t[N];int n,T,root[4*maxn],tot;void add(int &i,int l,int r,long long d){if (!i) i=++tot;t[i].sum+=d*((long long)r-l+1);t[i].tag+=d;}void release(int i,int l,int r){int mid=(l+r)/2;add(t[i].lch,l,mid,t[i].tag);add(t[i].rch,mid+1,r,t[i].tag);t[i].tag=0;}void update(int i){t[i].sum=t[t[i].lch].sum+t[t[i].rch].sum;}void modify_1D(int &i,int l,int r,int L,int R){if (!i) i=++tot;if (L<=l && r<=R) {add(i,l,r,1);return;}release(i,l,r);int mid=(l+r)/2;if (L<=mid) modify_1D(t[i].lch,l,mid,L,R);if (mid<R) modify_1D(t[i].rch,mid+1,r,L,R);update(i);}long long query_1D(int &i,int l,int r,int L,int R){if (!i) return 0;if (L<=l && r<=R) return t[i].sum;release(i,l,r);int mid=(l+r)/2,ans=0;if (L<=mid) ans+=query_1D(t[i].lch,l,mid,L,R);if (mid<R) ans+=query_1D(t[i].rch,mid+1,r,L,R);return ans;}void modify_2D(int i,int l,int r,int x,int L,int R){modify_1D(root[i],1,n,L,R);if (l==r) return;long long mid=(l+r)/2;if (x<=mid) modify_2D(i<<1,l,mid,x,L,R);if (mid<x) modify_2D(i<<1|1,mid+1,r,x,L,R);}int query_2D(int i,int l,int r,int c,int L,int R){if (l==r) return l;long long num=query_1D(root[i<<1|1],1,n,L,R);int mid=(l+r)/2;if (num>=c) return query_2D(i<<1|1,mid+1,r,c,L,R);else return query_2D(i<<1,l,mid,c-num,L,R);}int main(){scanf("%d%d",&n,&T);while (T--){int op,x,y,c;scanf("%d%d%d%d",&op,&x,&y,&c);if (op==1) modify_2D(1,1,n,c,x,y);else printf("%d\n",query_2D(1,1,n,c,x,y));}return 0;}
0 0
- 【BZOJ3110】【Zjoi2013】K大数查询 树套树 权值线段树套区间线段树
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
- 【bzoj3110】【ZJOI2013】【K大数查询】【权值线段树套位置线段树】
- bzoj3110[Zjoi2013]K大数查询 主席树套线段树
- [BZOJ3110][ZJOI2013]K大数查询(线段树套线段树)
- [BZOJ3110][Zjoi2013]K大数查询(主席树套线段树||整体二分 )
- 【BZOJ3110】K大数查询(ZJOI2013)-整体二分+线段树
- [BZOJ3110]K大数查询|线段树套线段树
- 【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树
- BSOJ3723:ZJOI2013 k大数查询 线段树套线段树
- 【ZJOI2013】K 大数查询 ( 树状数组套线段树 )
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
- 【线段树套线段树】[ZJOI 2013] bzoj3110 K大数查询
- bzoj3110: [Zjoi2013]K大数查询 树套数
- BZOJ 3110: [Zjoi2013]K大数查询|线段树套线段树
- 3110: [Zjoi2013]K大数查询 线段树套线段树 标记永久化
- bzoj 3110: [Zjoi2013]K大数查询 线段树套线段树
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
- Android Handle机制 理解Looper、Handle、Message的关系
- 在Win7下搭建GIT SSH服务
- windows linux 数据互传
- 移动工作站,不一定是笔记本!
- identifier of an instance was altered from XXXX to XXXX解决
- 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
- Xcode 报警告:The operation couldn’t be completed. (LaunchServicesError error 0.)
- 欢迎使用CSDN-markdown编辑器
- windows linux 文件互传
- 交叉验证原理
- myeclipse10点击部署按钮没反应
- DragonBoard 410c手把手Linux开发
- Eclipse快捷键大全(转载)
- Dialog使用心得