Description

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

Solution

怎么做

一看到什么中位数,k小数,数据范围又不大,那么就可以二分出一个mid,找出比mid小的个数有多少个。
因为每个数对当前判断的贡献只有是与不是,去或不去,那么用1或-1规划一下就好了。比mid的小的设为-1,否则设为1,那么区间[l…r]中如果中位数为mid那么就是这些1和-1的和加起来≥0。
因为b到c必须要取,所以把区间拆解一下变成[a..b]中的最长后缀和+[a+1…b-1]的和+[c…d]中的最长前缀和。

用什么?

强制在线,那么就是可持久化结构。还支持询问,取max。
可持久化线段树。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=20007;
int i,j,k,l,n,m,ans,data[maxn],u,v,r,mid,num,tt;
int root[maxn],q[5];
struct node{int lda,sum,l,r,rda;
}t[25000*30],op;
struct nod{int a,b;
}a[maxn];
bool cmp(nod x,nod y){return x.a<y.a;
}
int read(){int x=0,f=-1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x;
}
void merge(int x){t[x].sum=t[t[x].l].sum+t[t[x].r].sum;t[x].lda=max(t[t[x].l].lda,t[t[x].l].sum+t[t[x].r].lda);t[x].rda=max(t[t[x].r].rda,t[t[x].r].sum+t[t[x].l].rda);
}
void build(int &x,int l,int r){if(!x)x=++num;if(l==r){t[x].lda=t[x].sum=t[x].rda=1;}else{int mid=(l+r)/2;build(t[x].l,l,mid);build(t[x].r,mid+1,r);merge(x);}
}
void change(int &x,int l,int r,int y){t[++num]=t[x];x=num;if(l==r){t[x].lda=t[x].sum=t[x].rda=-1;return;}int mid=(l+r)/2;if(y<=mid)change(t[x].l,l,mid,y);else change(t[x].r,mid+1,r,y);merge(x);
}
node bing(node x,node y){node z;z.sum=x.sum+y.sum;z.l=x.l;z.r=y.r;z.lda=max(x.lda,x.sum+y.lda);z.rda=max(y.rda,y.sum+x.rda);return z;
}
node find(int x,int l,int r,int y,int z){if(y>z)return op;if(l==y&&r==z){return t[x];}else{int mid=(l+r)/2;if(z<=mid)return find(t[x].l,l,mid,y,z);else if (y>mid)return find(t[x].r,mid+1,r,y,z);else{return bing(find(t[x].l,l,mid,y,mid),find(t[x].r,mid+1,r,mid+1,z));    }}
}
int pan(int x){return find(root[x],1,n,q[1],q[2]).rda+find(root[x],1,n,q[2]+1,q[3]-1).sum+find(root[x],1,n,q[3],q[4]).lda;
}
int main(){n=read();fo(i,1,n){a[i].a=read();a[i].b=i;}sort(a+1,a+1+n,cmp);build(root[1],1,n);fo(i,2,n){root[i]=root[i-1];change(root[i],1,n,a[i-1].b);}m=read();fo(i,1,m){k=read();tt=read();u=read();v=read();q[1]=(k+ans)%n+1;q[2]=(tt+ans)%n+1;q[3]=(u+ans)%n+1;q[4]=(v+ans)%n+1;sort(q+1,q+5);l=1,r=n;while(l<r){mid=(l+r+1)/2;int pp=pan(mid);if(pp>=0)l=mid;else r=mid-1;}ans=a[l].a;printf("%d\n",ans);}
}

【集训队互测 2012】Middle相关推荐

  1. 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4463 Prob ...

  2. jzoj 2867. 【集训队互测 2012】Contra

    Description 偶然间,chnlich 发现了他小时候玩过的一个游戏"魂斗罗",于是决定怀旧.但是这是一个奇怪的魂斗罗 MOD. 有 N 个关卡,初始有 Q 条命. 每通过 ...

  3. UOJ#191. 【集训队互测2016】Unknown

    UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...

  4. [2015国家集训队互测]口胡

    比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...

  5. 「2019 集训队互测 Day 1」最短路径 解题报告

    一.题目概述 题目链接:Libre OJ. 给出一张图,求出 ans=∑i=1n∑j=1n[i≠j]dk(i,j)ans=\sum_{i=1}^n\sum_{j=1}^n[i\ne j]\texttt ...

  6. 【LOJ3077】「2019 集训队互测 Day 4」绝目编诗

    [题目链接] 点击打开链接 [思路要点] 不难发现各个边双连通分量可以分开处理,桥边可以直接删除. 可以证明,对于每一个边双连通分量,当 M−NM-NM−N 超过 O(N)O(\sqrt{N})O(N ...

  7. 【集训队互测2015】最大异或和

    首先不知道有没有神仙线段树分治过的. 首先一个较为显然的性质: \[ \mathrm{Span}\{v_1, v_2, \dots, v_n\} = \mathrm{Span}\{v_1, v_2 - ...

  8. 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)

    题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...

  9. Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】

    正题 题目链接:https://loj.ac/p/3077 题目大意 给出nnn个点mmm条边的一张简单无向图,求是否存在两个长度相等的简单环. 1≤n≤104,1≤m≤1061\leq n\leq ...

  10. jzoj2908,P1527-[集训队互测 2012]矩阵乘法【整体二分,二维树状数组】

    正题 题目链接:https://www.luogu.org/problem/P1527 题目大意 给出一个矩阵,每个询问求子矩阵中的第kkk小数. 解题思路 我们发现我们对于每个询问我们可以二分答案, ...

最新文章

  1. AttributeError: ‘NoneType‘ object has no attribute ‘span‘
  2. Pascal's Triangle
  3. Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
  4. 邮件服务器postfix+cyrus
  5. Android Framework------之Property子系统
  6. python中的cli模块_Python 快速实现CLI 应用程序的脚手架
  7. jquery指定节点设css,jquery 获取和设置节点属性 css样式
  8. 带着canvas去流浪系列之九 粒子动画
  9. Java 高阶 —— 相等性比较
  10. CocosCreator简单小鸟穿越隧道小游戏
  11. 好用的代码加密软件,编程,编译数据安全
  12. 1984年图灵奖--尼克劳斯·沃思简介
  13. ajax读取json文件 / 跨域问题
  14. Android开发 mobi格式,Android MobIM的免费使用方法
  15. shell编程之iptables
  16. [UWP]使用SpringAnimation创建有趣的动画
  17. 纯前端JS实现一个登记照改换底色背景色功能
  18. 【hpuoj】OY问题
  19. 五子棋Pro-最好玩的五子棋游戏
  20. oracle的服务配置

热门文章

  1. c语言爬楼梯不用递归,[leetcode]爬楼梯的递归和非递归方法
  2. 微软面试58道逻辑面试题
  3. Rust:Match语句详解
  4. pyodbc mysql_Robot Framework 通过pyodbc连接Mysql
  5. 用postman GET调试阿里云银行卡二、三、四要素实名认证
  6. Android面试总结系列之面试技巧
  7. 如何给 PDF 文档批量添加页眉页脚?如何给 PDF 文档批量添加页码?
  8. 【Leetcode】1214. Two Sum BSTs
  9. 霍夫丁------霍夫丁不等式
  10. 手把手式介绍 ADNI 影像数据下载