传送门: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大数查询】【题解】【树套树】相关推荐

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

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

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

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

  3. [bzoj 3110] [ZJOI2013] K大数查询

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3110 题目: 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示 ...

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

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

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

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

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

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

  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. P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】

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

最新文章

  1. AWS EC2 Run Command特性新增多重云脚本
  2. ATL的GUI程序设计(前言)
  3. 全屏显示的包含webview的页面中弹出的软键盘覆盖输入框的问题
  4. 【干货】Html与CSS入门学习笔记12-14【完】
  5. css框架和js框架_优雅设计的顶级CSS框架
  6. 应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件...
  7. oracle 数据库导出
  8. 计算机图形学 A 课程 专业术语中英对照表
  9. Spring JdbcTemplate 多参数查询,以及like模糊查询处理方式
  10. 中文汉字错别字纠错方法
  11. mysql学习--mysql必知必会
  12. 关于QQ登录出现非官方应用 错误码100044的解决办法
  13. 解决Mac苹果电脑没有声音,喇叭会显示为灰色禁用状态
  14. 在Spring中的过滤器
  15. LVS 负载均衡集群(一)| 超详细!一文带你了解 LVS 负载均衡集群
  16. 使用k-means聚类anchors
  17. 【毕业设计/Matlab系列】基于PCM编译码和2ASK调制解调的通信系统仿真
  18. 英语学习笔记——语法篇(持续更新)
  19. JAVA SM2 数字证书生成
  20. 有什么软件可以测试面膜的好坏,检验面膜好坏的小妙招

热门文章

  1. 有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:
  2. 使用 ONLYOFFICE 宏监测空气质量数据
  3. 昌乐博闻学校2021年高考成绩查询,2021高考难度升级吗?两点忠告送给高考生
  4. 数据库中违反外键约束的情况
  5. python电路仿真软件_Arduino仿真软件64位Virtual Breadboard下载 v4.21
  6. cad动态块制作翻转_cad动态块拉伸制作方法,单开门动态块制作教程具体分析
  7. 打地鼠程序设计c语言,打地鼠游戏的制作(C语言)含代码.ppt
  8. 如何防止黑客入侵服务器?
  9. Geoserver图层SLD样式编辑问题
  10. django-查询语句(一)