【BZOJ】【P3110】【ZJOI2013】【K大数查询】【题解】【树套树】
传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3110
写了一下午+一晚上还没A啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
修改log^2n查询log^3n T成翔啊啊啊啊啊啊啊啊啊啊啊啊啊
眼看队友线段树树状数组随便虐啊啊啊啊啊啊啊啊啊啊啊啊
自己的线段树套平衡树 T成翔啊啊啊啊啊啊啊啊啊啊啊啊啊
Code:
#include<cstdio>
#include<cctype>
#include<climits>
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
using namespace std;
typedef long long LL;
const int maxn=50001;
int getint(){ int res=0;char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))res=(res<<3)+(res<<1)+(ch-'0'),ch=getchar(); return res;
}
int n,m;
int rnd(){static int KEY=978654321;return KEY+=KEY<<2|1;
}
int maxx=0;
struct node;
struct node{int val,key,size,s;node *c[2];void set(int _val=0,int _key=rnd(),int _size=1,int _s=1,node *C=NULL){val=_val;key=_key;size=_size;s=_s;c[0]=c[1]=C;}void rz(){size=c[0]->size+s+c[1]->size;}
};
node pool[maxn*65];
node *newnode(){static int tot=0;if(tot<maxn*65)return &pool[tot++];return new node();
}
struct Treap{node *root,*Null;Treap(){Null=newnode();Null->set(0,INT_MAX,0,0,Null); root=Null;}void rot(node *&t,bool d){node *p=t->c[d];t->c[d]=p->c[!d];p->c[!d]=t;t->rz();p->rz();t=p;}void _insert(node *&t,int x,int siz){if(t==Null){t=newnode();t->set(x,rnd(),siz,siz,Null);return;}if(t->val==x){t->size+=siz;t->s+=siz;return;}_insert(t->c[x>t->val],x,siz);if(t->c[x>t->val]->key<t->key)rot(t,x>t->val);else t->rz();}int _find(node *t,int &x){if(t==Null)return 0;if(t->val==x)return t->s;return _find(t->c[x>t->val],x);}int _rank(node *t,int &x){ int res=0,s;for(node *t=root;t!=Null;){s=t->c[0]->size+t->s;if(x>t->val)res+=s,t=t->c[1];else t=t->c[0];}return res;} void insert(int x,int siz){_insert(root,x,siz);}int rank(int x){return _rank(root,x);}int size(){return root->size;}int find(int x){return _find(root,x);}
};
int Ranks,Finds;
unsigned int Size;
struct seg_tree{Treap loc[maxn<<2];Treap lazy[maxn<<2];void change(int i,int l,int r,int l0,int r0,int c){ if(l0<=l&&r0>=r){ lazy[i].insert(c,r-l+1); return;}int mid=(l+r)>>1;loc[i].insert(c,min(r,r0)-max(l,l0)+1);if(l0<=mid)change(i<<1,l,mid,l0,r0,c);if(r0>mid)change(i<<1|1,mid+1,r,l0,r0,c);}void _rank(int i,int l,int r,int l0,int r0,int x){Ranks+=(LL)lazy[i].rank(x)*(min(r,r0)-max(l,l0)+1)/(r-l+1);if(l0<=l&&r0>=r){Ranks+=loc[i].rank(x);return;}int mid=(l+r)>>1;if(l0<=mid)_rank(i<<1,l,mid,l0,r0,x);if(r0>mid)_rank(i<<1|1,mid+1,r,l0,r0,x);}int rank(int l,int r,int x){Ranks=0;_rank(1,1,n,l,r,x);return Ranks;}void _size(int i,int l,int r,int l0,int r0){Size+=lazy[i].size()/(r-l+1)*(min(r,r0)-max(l,l0)+1);if(l0<=l&&r0>=r){Size+=loc[i].size();return ;}int mid=(l+r)>>1;if(l0<=mid)_size(i<<1,l,mid,l0,r0);if(r0>mid)_size(i<<1|1,mid+1,r,l0,r0); }unsigned int size(int l,int r){Size=0;_size(1,1,n,l,r);return Size;}void _find(int i,int l,int r,int l0,int r0,int x){Finds+=lazy[i].find(x)/(r-l+1)*(min(r,r0)-max(l,l0)+1);if(l0<=l&&r0>=r){Finds+=loc[i].find(x);return ;}int mid=(l+r)>>1; if(l0<=mid)_find(i<<1,l,mid,l0,r0,x);if(r0>mid)_find(i<<1|1,mid+1,r,l0,r0,x); }int find(int l,int r,int x){Finds=0;_find(1,1,n,l,r,x);return Finds;}
}T;
void Change(int l,int r,int k){T.change(1,1,n,l,r,k);
}
int Kth(int l0,int r0,int k){unsigned int siz=T.size(l0,r0);k=siz-k+1;unsigned int l=1,r=maxx,mid;while(l<r){mid=(l+r)>>1;int ra=T.rank(l0,r0,mid);int s=T.find(l0,r0,mid);if(!ra&&!s)ra=-1;if(ra==siz&&!s)ra=ra+1;if(ra+1<=k&&k<=ra+s)return mid;if(ra<k)l=mid+1;elser=mid;}return l;
}
void putint(int x){if(x<10)putchar(x+'0');else{putint(x/10);putchar(x%10+'0');}
}
int main(){int res,op,l,r,k;n=getint();m=getint();while(m--){op=getint();l=getint(),r=getint(),k=getint();if(op==1){Change(l,r,k);maxx=max(maxx,k);}else{res=Kth(l,r,k);putint(res);puts("");}}return 0;
}
【BZOJ】【P3110】【ZJOI2013】【K大数查询】【题解】【树套树】相关推荐
- bzoj 3110: [Zjoi2013]K大数查询(树套树)
树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...
- bzoj:3110: [Zjoi2013]K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- [bzoj 3110] [ZJOI2013] K大数查询
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3110 题目: 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示 ...
- BZOJ3110: [Zjoi2013]K大数查询
BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...
- P3332 [ZJOI2013]K大数查询(整体二分做法)
P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- 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 ...
- P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】
传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...
最新文章
- AWS EC2 Run Command特性新增多重云脚本
- ATL的GUI程序设计(前言)
- 全屏显示的包含webview的页面中弹出的软键盘覆盖输入框的问题
- 【干货】Html与CSS入门学习笔记12-14【完】
- css框架和js框架_优雅设计的顶级CSS框架
- 应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件...
- oracle 数据库导出
- 计算机图形学 A 课程 专业术语中英对照表
- Spring JdbcTemplate 多参数查询,以及like模糊查询处理方式
- 中文汉字错别字纠错方法
- mysql学习--mysql必知必会
- 关于QQ登录出现非官方应用 错误码100044的解决办法
- 解决Mac苹果电脑没有声音,喇叭会显示为灰色禁用状态
- 在Spring中的过滤器
- LVS 负载均衡集群(一)| 超详细!一文带你了解 LVS 负载均衡集群
- 使用k-means聚类anchors
- 【毕业设计/Matlab系列】基于PCM编译码和2ASK调制解调的通信系统仿真
- 英语学习笔记——语法篇(持续更新)
- JAVA SM2 数字证书生成
- 有什么软件可以测试面膜的好坏,检验面膜好坏的小妙招
热门文章
- 有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:
- 使用 ONLYOFFICE 宏监测空气质量数据
- 昌乐博闻学校2021年高考成绩查询,2021高考难度升级吗?两点忠告送给高考生
- 数据库中违反外键约束的情况
- python电路仿真软件_Arduino仿真软件64位Virtual Breadboard下载 v4.21
- cad动态块制作翻转_cad动态块拉伸制作方法,单开门动态块制作教程具体分析
- 打地鼠程序设计c语言,打地鼠游戏的制作(C语言)含代码.ppt
- 如何防止黑客入侵服务器?
- Geoserver图层SLD样式编辑问题
- django-查询语句(一)