bzoj 2653 middle (可持久化线段树)
middle
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 1981 Solved: 1097
[Submit][Status][Discuss]
Description
Input
Output
Q行依次给出询问的答案。
Sample Input
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0
271451044
271451044
969056313
Sample Output
HINT
0:n,Q<=100
1,...,5:n<=2000
0,...,19:n<=20000,Q<=25000
1 #include<cstring> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdio> 6 7 #define lson tr[p].ls 8 #define rson tr[p].rs 9 #define N 20007 10 using namespace std; 11 inline int read() 12 { 13 int x=0,f=1;char ch=getchar(); 14 while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();} 15 while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} 16 return x*f; 17 } 18 19 int n,m,sz,ans; 20 int a[N],id[N],rt[N]; 21 struct Node 22 { 23 int sum,lmx,rmx,ls,rs; 24 }tr[N*20]; 25 26 bool cmp(int x1,int x2) 27 { 28 return a[x1]<a[x2]; 29 } 30 void update(int p) 31 { 32 tr[p].sum=tr[lson].sum+tr[rson].sum; 33 tr[p].lmx=max(tr[lson].lmx,tr[lson].sum+tr[rson].lmx); 34 tr[p].rmx=max(tr[rson].rmx,tr[rson].sum+tr[lson].rmx); 35 } 36 void build(int &p,int l,int r) 37 { 38 p=++sz; 39 if (l==r) 40 { 41 tr[p].sum=tr[p].lmx=tr[p].rmx=1; 42 return; 43 } 44 int mid=(l+r)>>1; 45 build(tr[p].ls,l,mid),build(tr[p].rs,mid+1,r); 46 update(p); 47 } 48 void build_new(int yl,int l,int r,int &xz,int val,int z) 49 { 50 xz=++sz;tr[xz]=tr[yl]; 51 if (l==r) 52 { 53 tr[xz].lmx=tr[xz].rmx=tr[xz].sum=val; 54 return; 55 } 56 int mid=(l+r)>>1; 57 if (z<=mid) build_new(tr[yl].ls,l,mid,tr[xz].ls,val,z); 58 else build_new(tr[yl].rs,mid+1,r,tr[xz].rs,val,z); 59 update(xz); 60 } 61 int get_sum(int p,int l,int r,int x,int y) 62 { 63 if (l==x&&r==y) return tr[p].sum; 64 int mid=(l+r)>>1; 65 if (y<=mid) return get_sum(tr[p].ls,l,mid,x,y); 66 else if (x>mid) return get_sum(tr[p].rs,mid+1,r,x,y); 67 else return get_sum(tr[p].ls,l,mid,x,mid)+get_sum(tr[p].rs,mid+1,r,mid+1,y); 68 } 69 int get_rx(int p,int l,int r,int x,int y) 70 { 71 if (l==x&&r==y) return tr[p].lmx; 72 int mid=(l+r)>>1; 73 if (y<=mid) return get_rx(tr[p].ls,l,mid,x,y); 74 else if (x>mid) return get_rx(tr[p].rs,mid+1,r,x,y); 75 else return max(get_rx(tr[p].ls,l,mid,x,mid),get_sum(tr[p].ls,l,mid,x,mid)+get_rx(tr[p].rs,mid+1,r,mid+1,y)); 76 } 77 int get_lx(int p,int l,int r,int x,int y) 78 { 79 if (l==x&&r==y) return tr[p].rmx; 80 int mid=(l+r)>>1; 81 if (y<=mid) return get_lx(tr[p].ls,l,mid,x,y); 82 else if (x>mid) return get_lx(tr[p].rs,mid+1,r,x,y); 83 else return max(get_lx(tr[p].rs,mid+1,r,mid+1,y),get_sum(tr[p].rs,mid+1,r,mid+1,y)+get_lx(tr[p].ls,l,mid,x,mid)); 84 } 85 bool check(int k,int a,int b,int c,int d) 86 { 87 int sum=0; 88 if (b+1<=c-1) sum+=get_sum(rt[k],1,n,b+1,c-1); 89 sum+=get_lx(rt[k],1,n,a,b); 90 sum+=get_rx(rt[k],1,n,c,d); 91 return sum>=0;//大的个数多的话那么可以找更大的中位数、 92 } 93 int main() 94 { 95 n=read(); 96 for (int i=1;i<=n;i++) 97 a[i]=read(),id[i]=i; 98 sort(id+1,id+n+1,cmp); 99 build(rt[1],1,n); 100 for (int i=2;i<=n;i++) 101 build_new(rt[i-1],1,n,rt[i],-1,id[i-1]); 102 int qz[5]; 103 m=read(); 104 while(m--) 105 { 106 qz[1]=read(),qz[2]=read(),qz[3]=read(),qz[4]=read(); 107 for (int i=1;i<=4;i++) 108 qz[i]=(qz[i]+ans)%n; 109 for (int i=1;i<=4;i++) 110 qz[i]+=1; 111 sort(qz+1,qz+4+1); 112 int l=1,r=n,mid; 113 while(l<r) 114 { 115 mid=(l+r+1)>>1; 116 if (check(mid,qz[1],qz[2],qz[3],qz[4])) l=mid; 117 else r=mid-1; 118 } 119 ans=a[id[l]]; 120 printf("%d\n",ans); 121 } 122 }
转载于:https://www.cnblogs.com/fengzhiyuan/p/8059334.html
bzoj 2653 middle (可持久化线段树)相关推荐
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 177 Solved: 128 [Submit][Stat ...
- BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)
题目描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题目大意:求最小不能被一段区间中某些数的和表示的数.(还是看题面吧) 思路 可持久化 ...
- BZOJ 2653 middle
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题目大意:多组询问,求左右端点在规定范围内移动所能得到的最大中位数. [分析] 求中 ...
- SP10628 COT - Count on a tree (树剖+可持久化线段树)
题意: 给定一个包含 N 个结点的树. 树节点从 1 到 N编号..每个节点有一个整数权值. 我们会要求您执行以下操作: u v k : 询问从节点 u 到 节点 v 的路径上的第k小的权值 输入 在 ...
- 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解
P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...
最新文章
- spring cloud-zuul的Filter详解
- java文件保存异常_Java 实现把异常信息写入到文件中
- visual studio 最新稳定版本_Ubuntu 20.04 LTS 第一个小版本更新 20.04.1发布
- python:去重(list,dataframe)
- IntelliJ IDEA使用(一)基本设置与类、方法模板设置
- [转]Java反射机制详解
- 牛客挑战赛30 C 小G砍树 换根dp+组合
- java 动态实例化对象_记录Java中如何动态实例化一个对象
- Github 再现失误:部分用户密码明文暴漏
- 理解结构与表现相分离
- 环境安装(二):windows10下安装caffe框架(cuda10.0、cudnn7.6.4)
- 视频教程-nodejs教程-Node.js
- Stm32 Max6675 K型热电偶 采集温度值(代码+相关方法)
- 会声会影2020秘钥视频编辑制作使用教程
- 怀旧服显示服务器已满,十五年前的怀旧服居然还能服务器爆满 魔兽世界正式服算不算失败...
- 最全面的SpringMVC教程(六)——WebSocket
- 15个针对初学者的Python项目创意
- 汉字的书写效果的实现
- Matlab导出高清图片、且Word中压缩不失真、转换PDF不失真
- proteus绘制电路图常用元器件对照