P3332-[ZJOI2013]K大数查询【树套树】
正题
题目链接:https://www.luogu.com.cn/problem/P3332
题目大意
开始nnn个可以重复的集合,要求支持操作
- 1lrc:1\ l\ r\ c:1 l r c:将ccc加入集合l∼rl\sim rl∼r中
- 2lrk:2\ l\ r\ k:2 l r k:查询l∼rl\sim rl∼r的并集中第kkk大的数
解题思路
此题考验选手的卡常能力(
维护一个树套树,外面是一个权值线段树,然后每个节点套一个区间线段树。然后每次询问和修改的时候就只用使用该节点的线段树的l∼rl\sim rl∼r段即可。
然后区间线段树需要临时开点(废话
之后卡常的话用固定标记,标记不下传,查询的时候再根据沿路的标记来计算答案即可。
codecodecode
#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define rint register int
using namespace std;
const int M=5e4+10,N=(5e4)*400+10;
int n,m,tot,cnt,b[M],op[M],l[M],r[M],a[M];
int ls[N],rs[N],lazy[N],root[M*2];
ll val[N];
char buf[1<<23],*head=buf;//fread优化
inline int read(){int x=0,y=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')y=1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return y?-x:x;
}
template<typename T>
inline T read(){T x=0;int y=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')y=1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return y?-x:x;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+48);
}
inline void updata(int &x,int l,int r,int L=1,int R=n){if(!x)x=++cnt;val[x]+=(ll)(min(R,r)-max(L,l)+1);if(l<=L&&R<=r){lazy[x]++;return;}rint mid=(L+R)>>1;if(mid>=l)updata(ls[x],l,r,L,mid);if(r>mid)updata(rs[x],l,r,mid+1,R);return;
}
inline ll ask(int &x,int l,int r,int L=1,int R=n,ll t=0){if(!x) return (ll)(min(R,r)-max(L,l)+1)*t;if(l<=L&&R<=r)return val[x]+1ll*(min(R,r)-max(L,l)+1)*t;rint mid=(L+R)>>1;ll ans=0;if(mid>=l)ans+=ask(ls[x],l,r,L,mid,t+lazy[x]);if(r>mid)ans+=ask(rs[x],l,r,mid+1,R,t+lazy[x]);return ans;
}
inline void change(int l,int r,int pos,int L=1,int R=tot,int x=1){updata(root[x],l,r);if(L==R)return;rint mid=(L+R)>>1;if(pos<=mid)change(l,r,pos,L,mid,x<<1);else change(l,r,pos,mid+1,R,x<<1|1);return;
}
inline int query(int l,int r,ll k,int L=1,int R=tot,int x=1){if(L==R)return b[L];rint mid=(L+R)>>1;ll z=ask(root[x<<1|1],l,r);if(z<k)return query(l,r,k-z,L,mid,x<<1);return query(l,r,k,mid+1,R,x<<1|1);
}
int main()
{freopen("P3332_6.in","r",stdin);freopen("P3332_6.ans","w",stdout); n=read();m=read();for(rint i=1;i<=m;i++){op[i]=read();l[i]=read();r[i]=read();a[i]=read();if(op[i]==1)b[++tot]=a[i];}sort(b+1,b+1+tot);tot=unique(b+1,b+1+tot)-b-1;for(rint i=1;i<=m;i++){if(op[i]==1)a[i]=lower_bound(b+1,b+1+tot,a[i])-b,change(l[i],r[i],a[i]);if(op[i]==2)print(query(l[i],r[i],a[i])),putchar('\n');}return 0;
}
P3332-[ZJOI2013]K大数查询【树套树】相关推荐
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- P3332 [ZJOI2013]K大数查询(整体二分做法)
P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...
- P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】
传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...
- P3332 [ZJOI2013]K大数查询 - 整体二分-区间修改
题目链接:https://www.luogu.com.cn/problem/P3332 思路:我们区间修改用一个线段树维护就可以了. #include <bits/stdc++.h> us ...
- bzoj 3110: [Zjoi2013]K大数查询(树套树)
树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...
- BZOJ3110: [Zjoi2013]K大数查询
BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...
- bzoj3110 [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 10703 Solved: 3209 [Submit][ ...
- 3110: [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...
- [BZOJ3110] [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 9208 Solved: 2737 [Submit][S ...
- bzoj:3110: [Zjoi2013]K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
最新文章
- Controller类的方法上的RequestMapping一定要写在Controller类里吗?
- rt-thread端口时钟使能_(2)RTThread启动过程分析
- (10) ejb学习: Jpa的JTA事务和RESOURCE_LOCAL事务
- Ansible8:Playbook循环
- HDU2100 Lovekey【大数+进制】
- 阿里发力硬件,先做路由器再造电视机
- 真核有参转录组测序标准分析-3
- 毕业论文:基于响应式页面的新闻资讯类门户网站的设计与实现
- python逆向切片理解
- 广联达报错access_广联达软件报错问题汇总和解决方案.doc
- 智能访客机成大厦智能办公的亮点
- 基于 MQTT 通讯一个简单的 Java工程
- 计算机暑期学校心得,暑期学校培训心得体会(通用12篇)
- android悬浮窗口 关闭,Android悬浮窗的创建及关闭
- netstat 查看tcp 网络连接
- [海森推荐]人工智能-人工智能好书推荐
- 如何批量制作结业证书
- java 手写签名,signature java html5+ 手写签名 源码 Develop 238万源代码下载- www.pudn.com...
- ZT:故事里的事----读者风格且长篇,不喜勿入
- tableau自定义地图
热门文章
- bytecode java_Java 字节码解读
- ppt扇形图怎么显示数据_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
- 多个cpp文件生成so_boostpython:从多个.cpp文件创建一个模块(.so)
- python中merge函数怎么用_Python Merge函数原理及用法解析
- ab压力测试_Apache ab压力测试的知识点
- python找出一个数的所有因子_python – 找到最大素因子的正确算法
- C++11的for循环使用auto的新用法
- leetcode1005. K 次取反后最大化的数组和
- Java手写HashSet
- [数据结构]二叉树的性质