正题

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


题目大意

nnn个数字,mmm次询问给出(a,b,c,d)(a,b,c,d)(a,b,c,d)表示左端点在[a,b][a,b][a,b]中,右端点在[c,d][c,d][c,d]的子区间中中位数最大的值。


解题思路

显然我们需要二分一下答案midmidmid,然后我们要选择一个满足条件的子区间使得区间≥mid\geq mid≥mid的个数减去<mid<mid<mid的个数最大。

换一种主席树的方式,我们里面是一个按照区间的线段树,外面是按照值域分的。然后维护区间最大前缀和和最大后缀和即可。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=21000,M=N<<4;
struct node{int pre,suf,num;
};
int n,m,tot,a[N],b[N],q[4],rt[N];
int ls[M],rs[M],pre[M],suf[M],num[M];
vector<int> v[N];
void PushUp(int x,int L,int R){int mid=(L+R)>>1;if(!ls[x])ls[x]=++tot,pre[tot]=suf[tot]=-1,num[tot]=-(mid-L+1);if(!rs[x])rs[x]=++tot,pre[tot]=suf[tot]=-1,num[tot]=-(R-mid);pre[x]=max(pre[ls[x]],num[ls[x]]+pre[rs[x]]);suf[x]=max(suf[rs[x]],num[rs[x]]+suf[ls[x]]);num[x]=num[ls[x]]+num[rs[x]];return;
}
int Change(int x,int L,int R,int pos){int now=++tot;if(L==R){pre[now]=suf[now]=num[now]=1;return now;}int mid=(L+R)>>1;if(pos<=mid)ls[now]=Change(ls[x],L,mid,pos),rs[now]=rs[x];else rs[now]=Change(rs[x],mid+1,R,pos),ls[now]=ls[x];PushUp(now,L,R);return now;
}
node Ask(int x,int L,int R,int l,int r){if(l>r||!x)return (node){-1,-1,-(r-l+1)};int mid=(L+R)>>1;if(L==l&&R==r)return (node){pre[x],suf[x],num[x]};if(r<=mid)return Ask(ls[x],L,mid,l,r);if(l>mid)return Ask(rs[x],mid+1,R,l,r);node la=Ask(ls[x],L,mid,l,mid);node ra=Ask(rs[x],mid+1,R,mid+1,r);return (node){max(la.pre,la.num+ra.pre),max(ra.suf,ra.num+la.suf),la.num+ra.num};
}
bool check(int x,int a,int b,int c,int d){node L=Ask(rt[x],1,n,a,b);node M=Ask(rt[x],1,n,b+1,c-1);node R=Ask(rt[x],1,n,c,d);return (L.suf+M.num+R.pre)>=0;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+1+n);int cnt=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;v[a[i]].push_back(i);}for(int i=cnt;i>=1;i--){rt[i]=Change(rt[i+1],1,n,v[i][0]);for(int j=1;j<v[i].size();j++)rt[i]=Change(rt[i],1,n,v[i][j]);}scanf("%d",&m);int last=0;for(int i=1;i<=m;i++){scanf("%d%d%d%d",&q[1],&q[2],&q[3],&q[0]);q[1]=(q[1]+last)%n+1;q[2]=(q[2]+last)%n+1;q[3]=(q[3]+last)%n+1;q[0]=(q[0]+last)%n+1;sort(q,q+4);int l=1,r=cnt;while(l<=r){int mid=(l+r)>>1;if(check(mid,q[0],q[1],q[2],q[3]))l=mid+1;else r=mid-1;}printf("%d\n",last=b[r]);}return 0;
}

P2839-[国家集训队]middle【主席树,二分】相关推荐

  1. P2839 [国家集训队]middle(二分 套 主席树)

    P2839 [国家集训队]middle 有一个长度为nnn的序列,有mmm次询问,每次询问a,b,c,da, b, c, da,b,c,d,为l∈[a,b],r∈[c,d]l \in [a, b], ...

  2. 洛谷P2839 [国家集训队]middle(主席树)

    P2839 [国家集训队]middle 我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 mid ...

  3. bzoj 2653 洛谷 P2839 [国家集训队] middle

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2381  Solved: 1340 [Submit][Status][Di ...

  4. P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间

    传送门 文章目录 题意: 思路: 题意: 思路: 我们先解决怎么判断中位数的问题,我们可以二分一个midmidmid,将<mid<mid<mid的值都变成−1-1−1,其他的数都变成 ...

  5. P2839 [国家集训队]middle

    题面 • 提一下静态区间第k小的nlog2n的做法: 1. 建关于排名的主席树(按排名顺序建树). 2. 二分答案. • 这样做静态区间第k小的虽然有些ZZ,但它的意义在于将线段树   维护的对象改变 ...

  6. 可持久化普通线段树 ---- P2839 [国家集训队]middle 可持久化普通线段树 + 二分 求中位数最大值

    题目链接 题目大意: 解题思路: 这个题思路很妙!! 首先我们假设只有一次询问怎么做? 那么我们可以二分出这个最大值midmidmid,然后把大于等于midmidmid设置成111,把小于midmid ...

  7. HDU4417 Super Mario(离线树状数组或者主席树+二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. [国家集训队]middle(二分+主席树[中位数思维题])

    文章目录 点击查看 solution code 点击查看 solution 简单口胡一下就跑 考虑二分答案ansansans 区间[x1,x2],x1∈[a,b],x2∈[c,d][x1,x2],x1 ...

  9. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)

    Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...

最新文章

  1. [转]SVN更新的时候前面字母的意思(U、G、A、R、C)
  2. Laplacian Eigenmaps 拉普拉斯特征映射
  3. 理解javascript中的函数模式
  4. Dubbo 注解驱动(Annotation-Driven)
  5. 产品设计的Kawaiization
  6. 一个USB HUB电路分享
  7. 盲盒拓客小程序商家联盟红包分销裂变抽奖小程序源码
  8. 测试beta测试_重新想象不断变化的自动化世界中的Beta测试
  9. [转] WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
  10. python数据分析课程哪个好-数据分析课程里面,python是重点!
  11. sed 、awk用法
  12. Win7系统自带 计算器 详细使用方法
  13. 摄影构图学pdf_简单易懂,摄影小白也能Get的摄影技巧!
  14. 1.2版走迷宫小游戏(C++)
  15. 802.1Q封装的VLAN数据帧格式
  16. win10使用pip安装tensorflow
  17. 对抗攻击经典论文——FGSM学习笔记 EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
  18. 深度学习跨层网络结构--特征融合
  19. Java学习必备书籍推荐终极版!
  20. linux所说的挂载是什么意思

热门文章

  1. 在java中写出html代码,在java里写html代码
  2. android vcard解析代码,Android使用vcard文件的方法简单实例
  3. mysql slave 1032_修复mysql slave复制1032错误
  4. java 按钮设置图片_Java中如何设置带图片按钮的大小
  5. html插入图片和文字,HTML第三课文字图片插入
  6. 计算机组成原理第04章在线测试,计算机组成原理第四章单元测试(二)(含答案).docx...
  7. android dialog 自定义布局,如何设置AlertDialog的自定义布局?
  8. Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...
  9. Java容器的遍历之增强for循环
  10. linux 启动程序 绑定id,linux如何根据进程ID查找启动程序的路径