【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树
2016-04-13 10:39
399 查看
权值线段树套区间线段树
外层线段树按照完全二叉树的建法全部建出
内层线段树动态开点
外层的每个节点上都建一棵区间线段树,维护权值在[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 20000100
using namespace std;
struct yts
{
int lch,rch;
long long tag,sum;
}t
;
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;
}
外层线段树按照完全二叉树的建法全部建出
内层线段树动态开点
外层的每个节点上都建一棵区间线段树,维护权值在[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 20000100
using namespace std;
struct yts
{
int lch,rch;
long long tag,sum;
}t
;
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;
}
相关文章推荐
- ubuntu12.04 android studio 安装
- C++中函数指针与数组
- Xcode 报警告:The operation couldn’t be completed. (LaunchServicesError error 0.)
- DragonBoard 410c手把手Linux开发
- innerText和textContent区别
- windows linux 文件互传
- free函数在操作系统内存中的实现【转】
- LightOJ 1220 Mysterious Bacteria 水题
- 数据库学习之旅——实验1
- iOS开发之网络编程篇三:同步,异步请求差异及用法
- 物流面单 标签纸打印机设置
- Android Handle机制 理解Looper、Handle、Message的关系
- location对象
- iOS常用系统调用
- RESTful学习笔记
- windows linux 数据互传
- 在Win7下搭建GIT SSH服务
- 机器学习:weka中Evaluation类源码解析及输出AUC及交叉验证介绍
- RESTful学习笔记
- Bootstrap3.0学习教程十七:JavaScript插件模态框