博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3332 [ZJOI2013]K大数查询
阅读量:4315 次
发布时间:2019-06-06

本文共 1992 字,大约阅读时间需要 6 分钟。

注意操作 $1$ 是在区间的每个位置加入一个数,不是加上一个值

相当于每个位置维护的是一个集合

显然树套树

一开始想的是区间线段树套权值线段树

发现这样询问区间第 $K$ 大时就要先二分答案再用 $O(log^2_n)$ 时间查询

那么单次询问的复杂度就有 $O(log^3_n)$ ,显然不行

考虑权值线段树套区间线段树

单次插入复杂度还是 $O(log^2_n)$,询问时只要在权值线段树上二分就行

那么单次操作复杂度就是 $O(log^2_n)$

据说此题很卡常,为了防止我的大常数导致 $GG$ 所以学了一下线段树的标记用久化

简单说就是标记不下传,只要询问时把经过节点的标记加进来一起计算贡献,代码不难想

因为空间问题所以内层的区间线段树要动态开点

因为插入的数可能为负,所以要离散化,注意 $long long$ !

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}inline ll readll(){ ll x=0; int f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}const int N=2e5+7,M=2e7+7;int n,m,cnt,A[N],T;int rt[N],L[M],R[M],tag[M];//区间线段树的数组,根节点,左儿子,右儿子,永久标记ll sum[M];//区间线段树数组,区间和int ql,qr; ll res;void add(int &o,int l,int r)//区间加1{ if(!o) o=++cnt;//动态开点 sum[o]+= max( min(r,qr)-max(l,ql)+1 ,0) ;//因为永久标记所以要这样更新sum if(l>=ql&&r<=qr) { tag[o]++; return; }//注意我的tag是给儿子的,要先更新sum int mid=l+r>>1; if(ql<=mid) add(L[o],l,mid); if(qr>mid) add(R[o],mid+1,r);}void query(int o,int l,int r,int tot)//区间求和,tot维护当前经过节点的tag的和{ if(l>=ql&&r<=qr) { res+=sum[o]+1ll*(r-l+1)*tot; return; }//更新res int mid=l+r>>1; if(ql<=mid) query(L[o],l,mid,tot+tag[o]); if(qr>mid) query(R[o],mid+1,r,tot+tag[o]);}int POS,RES; ll K;void ADD(int o,int l,int r)//权值线段树插入{ add(rt[o],1,n); if(l==r) return; int mid=l+r>>1; if(POS<=mid) ADD(o<<1,l,mid); else ADD(o<<1|1,mid+1,r);}void QUERY(int o,int l,int r)//权值线段树处理询问{ if(l==r) { RES=A[l]; return; } int mid=l+r>>1; res=0; query(rt[o<<1|1],1,n,0);//注意优先走大的! if(res

 

转载于:https://www.cnblogs.com/LLTYYC/p/10648208.html

你可能感兴趣的文章
Jquery-menu-aim流畅的菜单滑动体验
查看>>
Jquery EasyUI修改行背景的两种方式
查看>>
生成器模式(Builder)C++实现
查看>>
Centos 7.5安装 Redis 5.0.0
查看>>
嵌入式Linux学习笔记(0)基础命令。——Arvin
查看>>
二分图匹配
查看>>
c++ 模板template
查看>>
javascript中的string对象
查看>>
CString的成员函数详解
查看>>
Appium Studio 初体验(windows做ios自动化,录制appium脚本)
查看>>
学习java前端 两种form表单提交方式
查看>>
Linux常用命令
查看>>
整体二分&cdq分治 ZOJ 2112 Dynamic Rankings
查看>>
【POJ2976】Dropping tests (01分数规划入门题)
查看>>
通过正则表达式获取url中参数
查看>>
86.运算符重载
查看>>
cxx signal信号捕获
查看>>
《Android开发艺术探索》读书笔记——Cha3.2.3改变布局参数实现View的滑动
查看>>
python闭包与装饰器
查看>>
Acegi 源码解释
查看>>