遇事不决,二分试试

解析

很好的一道题
真是把主席树玩明白了
一个关于中位数的常用trick:

二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0

然而如果对离散化后的每一个值建一棵小白逛公园那样的线段树显然时空双炸
这里主席树就用上了
注意到关于相邻的值域所建的两棵主席树只有个别值从1变成-1
所以就用主席树优化时空即可
时间复杂度mlogn2mlogn^2mlogn2,空间复杂度nlognnlognnlogn

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=20050;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
int tot,r[N];
struct node{int sum,l,r;
};
struct tree{int ls,rs;node o;
}tr[N*20];
inline node merge(node a,node b){node res;res.sum=a.sum+b.sum;res.l=max(a.l,a.sum+b.l);res.r=max(b.r,b.sum+a.r);return res;
}
#define pushup(k) tr[k].o=merge(tr[tr[k].ls].o,tr[tr[k].rs].o)
inline int copy(int x){tr[++tot]=tr[x];return tot;
}
#define mid ((l+r)>>1)
void build(int &k,int l,int r){k=copy(k);if(l==r){tr[k].o=(node){1,1,1};return;}build(tr[k].ls,l,mid);build(tr[k].rs,mid+1,r);pushup(k);//printf("k=%d (%d %d) sum=%d l=%d r=%d\n",k,l,r,tr[k].o.sum,tr[k].o.l,tr[k].o.r);
}
void upd(int &k,int l,int r,int p,int v){k=copy(k);if(l==r){tr[k].o=(node){v,max(v,0),max(v,0)};return;}if(p<=mid) upd(tr[k].ls,l,mid,p,v);else upd(tr[k].rs,mid+1,r,p,v);pushup(k);return;
}
node ask(int k,int l,int r,int x,int y){//printf("  k=%d (%d %d) x=%d y=%d sum=%d\n",k,l,r,x,y,tr[k].o.sum);if(x<=l&&r<=y) return tr[k].o;else if(y<=mid) return ask(tr[k].ls,l,mid,x,y);else if(x>mid) return ask(tr[k].rs,mid+1,r,x,y);else return merge(ask(tr[k].ls,l,mid,x,y),ask(tr[k].rs,mid+1,r,x,y));
}
int a[N],q[N],num;
vector <int>v[N];
int w[5];
bool check(int k,int a,int b,int c,int d){//printf("check:k=%d x=%d (%d %d) (%d %d)\n",k,q[k],a,b,c,d);node o=ask(r[k],1,n,b,c),u=ask(r[k],1,n,a,b-1),v=ask(r[k],1,n,c+1,d);//printf("res=%d+%d+%d\n\n",o.sum,u.r,v.l);return o.sum+u.r+v.l>=0;
}
int main(){n=read();for(int i=1;i<=n;i++) a[i]=q[i]=read();sort(q+1,q+1+n);num=unique(q+1,q+1+n)-q-1;for(int i=1;i<=n;i++){a[i]=lower_bound(q+1,q+1+num,a[i])-q;v[a[i]].push_back(i);}build(r[1],1,n);for(int i=1;i<num;i++){r[i+1]=r[i];for(int j=0;j<v[i].size();j++){int pl=v[i][j];upd(r[i+1],1,n,pl,-1);}}m=read();int lst=0;for(int i=1;i<=m;i++){for(int j=1;j<=4;j++) w[j]=(read()+lst)%n;sort(w+1,w+1+4);int a=w[1],b=w[2],c=w[3],d=w[4];a++;b++;c++;d++;int st=1,ed=num;while(st<ed){int o=(st+ed+1)>>1;if(check(o,a,b,c,d)) st=o;else ed=o-1;}printf("%d\n",lst=q[st]);}return 0;
}

YBTOJ洛谷P2839:最大中位数(主席树、二分答案)相关推荐

  1. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  2. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  3. BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案

    题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...

  4. 洛谷 [P1024]一元三次方程求解【二分答案】

    题目链接:https://www.luogu.org/problemnew/show/P1024 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b ...

  5. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

  6. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

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

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

  8. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  9. 洛谷——P1047 校门外的树 python实现

    洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...

最新文章

  1. javascript,继承,封装
  2. golang ide 简介
  3. golang的bytes.buffer
  4. 线段树什么的最讨厌了
  5. exports,和module.exports 的区别
  6. 必须知道的ADO.NET 数据库连接池
  7. C++对双链表的操作
  8. ztree的树形结构不能正常显示原因
  9. ubuntu下screen的使用
  10. 360浏览器调试html5,360浏览器如何打开调试工具
  11. Android开发:为什么你的学习效率如此低,为什么你很迷茫?
  12. 左手鼠标指针——Windows11Aeroleft
  13. 记录一次在线网页加密PDF解密过程
  14. 距离度量 —— 杰卡德距离(Jaccard Distance)
  15. 作为兼并重组的重要方式之一,企业合并、分立的具体形式?
  16. EventBus底层实现原理
  17. 什么叫计算机网络虫洞,虫洞:危险与希望并存
  18. 转帖:励建书:数学有助于大众理性思维的培养
  19. 超链接一般有两种表现形式_超链接有哪几种类型,各有什么作用
  20. AD如何走蛇形线和圆角拐角

热门文章

  1. 宝塔linux面板假设nextcloud,宝塔面板部署NextCloud(14.0.3)逐一解决后台安全及设置警告...
  2. 计算机专业的双证在职研究生,计算机类在职研究生最终能获得双证吗难度是不是很大呢...
  3. 阅读Java_如何阅读 Java 开源代码?
  4. windows传真和扫描由于不能访问您的文档_扫描识别工具Dynamic Web TWAIN全年最低价来了!错过再等一年...
  5. php oracle 锁表,ORACLE 用户锁定问题
  6. 文件共享服务器第二部,第二章-构建Samba文件共享服务器.docx
  7. 计算机专业的吸引力,计算机专业文献翻译-面向对象编程具有多方面的吸引力.doc...
  8. bcm943602cs蓝牙用不了_原来手机的蓝牙功能这么强大!除了连接耳机,还有这六大实用功能...
  9. 34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !
  10. [JavaWeb-Servlet]Servlet相关配置