middle

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 1981  Solved: 1097
[Submit][Status][Discuss]

Description

一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。给你一个
长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。
其中a<b<c<d。位置也从0开始标号。我会使用一些方式强制你在线。

Input

第一行序列长度n。接下来n行按顺序给出a中的数。
接下来一行Q。然后Q行每行a,b,c,d,我们令上个询问的答案是
x(如果这是第一个询问则x=0)。
令数组q={(a+x)%n,(b+x)%n,(c+x)%n,(d+x)%n}。
将q从小到大排序之后,令真正的
要询问的a=q[0],b=q[1],c=q[2],d=q[3]。  
输入保证满足条件。
第一行所谓“排过序”指的是从大到小排序!

Output

Q行依次给出询问的答案。

Sample Input

5
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,小的为-1,则sum>=0即可判断是否可以比当前二分的
  中位数更大,然后就可以,所以对于从小到大,开n个不同状态的线段树,这样就可以了。
  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 (可持久化线段树)相关推荐

  1. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  2. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

  3. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  4. bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  5. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  6. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 177  Solved: 128 [Submit][Stat ...

  7. BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)

    题目描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题目大意:求最小不能被一段区间中某些数的和表示的数.(还是看题面吧) 思路 可持久化 ...

  8. BZOJ 2653 middle

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题目大意:多组询问,求左右端点在规定范围内移动所能得到的最大中位数. [分析] 求中 ...

  9. SP10628 COT - Count on a tree (树剖+可持久化线段树)

    题意: 给定一个包含 N 个结点的树. 树节点从 1 到 N编号..每个节点有一个整数权值. 我们会要求您执行以下操作: u v k : 询问从节点 u 到 节点 v 的路径上的第k小的权值 输入 在 ...

  10. 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解

    P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...

最新文章

  1. spring cloud-zuul的Filter详解
  2. java文件保存异常_Java 实现把异常信息写入到文件中
  3. visual studio 最新稳定版本_Ubuntu 20.04 LTS 第一个小版本更新 20.04.1发布
  4. python:去重(list,dataframe)
  5. IntelliJ IDEA使用(一)基本设置与类、方法模板设置
  6. [转]Java反射机制详解
  7. 牛客挑战赛30 C 小G砍树 换根dp+组合
  8. java 动态实例化对象_记录Java中如何动态实例化一个对象
  9. Github 再现失误:部分用户密码明文暴漏
  10. 理解结构与表现相分离
  11. 环境安装(二):windows10下安装caffe框架(cuda10.0、cudnn7.6.4)
  12. 视频教程-nodejs教程-Node.js
  13. Stm32 Max6675 K型热电偶 采集温度值(代码+相关方法)
  14. 会声会影2020秘钥视频编辑制作使用教程
  15. 怀旧服显示服务器已满,十五年前的怀旧服居然还能服务器爆满 魔兽世界正式服算不算失败...
  16. 最全面的SpringMVC教程(六)——WebSocket
  17. 15个针对初学者的Python项目创意
  18. 汉字的书写效果的实现
  19. Matlab导出高清图片、且Word中压缩不失真、转换PDF不失真
  20. proteus绘制电路图常用元器件对照

热门文章

  1. cocos2d-x 从onEnter、onExit、 引用计数 谈内存泄露问题
  2. 大数据量传输时配置WCF的注意事项
  3. 轮距和轴距有什么区别_为什么很多国产车都设计得窄高窄高的,是为了节省成本吗?...
  4. 3.7 PPP协议和HDLC协议
  5. DSP集成开发工具CCS的Git工具使用说明(一)
  6. CCS V5 创建工程和配置软件仿真
  7. 收发机中数字中频的设计
  8. kivy中kv语言的变态用法
  9. pythorch创建简单的神经网络源码
  10. docker的学习笔记(一)-一些基本的命令的学习