正题

题目链接:https://www.luogu.com.cn/problem/P3332


题目大意

开始nnn个可以重复的集合,要求支持操作

  1. 1lrc:1\ l\ r\ c:1 l r c:将ccc加入集合l∼rl\sim rl∼r中
  2. 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大数查询【树套树】相关推荐

  1. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  2. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  3. P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】

    传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...

  4. P3332 [ZJOI2013]K大数查询 - 整体二分-区间修改

    题目链接:https://www.luogu.com.cn/problem/P3332 思路:我们区间修改用一个线段树维护就可以了. #include <bits/stdc++.h> us ...

  5. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  6. BZOJ3110: [Zjoi2013]K大数查询

    BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...

  7. bzoj3110 [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 10703  Solved: 3209 [Submit][ ...

  8. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  9. [BZOJ3110] [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 9208  Solved: 2737 [Submit][S ...

  10. bzoj:3110: [Zjoi2013]K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

最新文章

  1. Controller类的方法上的RequestMapping一定要写在Controller类里吗?
  2. rt-thread端口时钟使能_(2)RTThread启动过程分析
  3. (10) ejb学习: Jpa的JTA事务和RESOURCE_LOCAL事务
  4. Ansible8:Playbook循环
  5. HDU2100 Lovekey【大数+进制】
  6. 阿里发力硬件,先做路由器再造电视机
  7. 真核有参转录组测序标准分析-3
  8. 毕业论文:基于响应式页面的新闻资讯类门户网站的设计与实现
  9. python逆向切片理解
  10. 广联达报错access_广联达软件报错问题汇总和解决方案.doc
  11. 智能访客机成大厦智能办公的亮点
  12. 基于 MQTT 通讯一个简单的 Java工程
  13. 计算机暑期学校心得,暑期学校培训心得体会(通用12篇)
  14. android悬浮窗口 关闭,Android悬浮窗的创建及关闭
  15. netstat 查看tcp 网络连接
  16. [海森推荐]人工智能-人工智能好书推荐
  17. 如何批量制作结业证书
  18. java 手写签名,signature java html5+ 手写签名 源码 Develop 238万源代码下载- www.pudn.com...
  19. ZT:故事里的事----读者风格且长篇,不喜勿入
  20. tableau自定义地图

热门文章

  1. bytecode java_Java 字节码解读
  2. ppt扇形图怎么显示数据_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
  3. 多个cpp文件生成so_boostpython:从多个.cpp文件创建一个模块(.so)
  4. python中merge函数怎么用_Python Merge函数原理及用法解析
  5. ab压力测试_Apache ab压力测试的知识点
  6. python找出一个数的所有因子_python – 找到最大素因子的正确算法
  7. C++11的for循环使用auto的新用法
  8. leetcode1005. K 次取反后最大化的数组和
  9. Java手写HashSet
  10. [数据结构]二叉树的性质