【集训队互测 2012】Middle
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相关推荐
- 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4463 Prob ...
- jzoj 2867. 【集训队互测 2012】Contra
Description 偶然间,chnlich 发现了他小时候玩过的一个游戏"魂斗罗",于是决定怀旧.但是这是一个奇怪的魂斗罗 MOD. 有 N 个关卡,初始有 Q 条命. 每通过 ...
- UOJ#191. 【集训队互测2016】Unknown
UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...
- [2015国家集训队互测]口胡
比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...
- 「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 ...
- 【LOJ3077】「2019 集训队互测 Day 4」绝目编诗
[题目链接] 点击打开链接 [思路要点] 不难发现各个边双连通分量可以分开处理,桥边可以直接删除. 可以证明,对于每一个边双连通分量,当 M−NM-NM−N 超过 O(N)O(\sqrt{N})O(N ...
- 【集训队互测2015】最大异或和
首先不知道有没有神仙线段树分治过的. 首先一个较为显然的性质: \[ \mathrm{Span}\{v_1, v_2, \dots, v_n\} = \mathrm{Span}\{v_1, v_2 - ...
- 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)
题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...
- Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】
正题 题目链接:https://loj.ac/p/3077 题目大意 给出nnn个点mmm条边的一张简单无向图,求是否存在两个长度相等的简单环. 1≤n≤104,1≤m≤1061\leq n\leq ...
- jzoj2908,P1527-[集训队互测 2012]矩阵乘法【整体二分,二维树状数组】
正题 题目链接:https://www.luogu.org/problem/P1527 题目大意 给出一个矩阵,每个询问求子矩阵中的第kkk小数. 解题思路 我们发现我们对于每个询问我们可以二分答案, ...
最新文章
- AttributeError: ‘NoneType‘ object has no attribute ‘span‘
- Pascal's Triangle
- Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
- 邮件服务器postfix+cyrus
- Android Framework------之Property子系统
- python中的cli模块_Python 快速实现CLI 应用程序的脚手架
- jquery指定节点设css,jquery 获取和设置节点属性 css样式
- 带着canvas去流浪系列之九 粒子动画
- Java 高阶 —— 相等性比较
- CocosCreator简单小鸟穿越隧道小游戏
- 好用的代码加密软件,编程,编译数据安全
- 1984年图灵奖--尼克劳斯·沃思简介
- ajax读取json文件 / 跨域问题
- Android开发 mobi格式,Android MobIM的免费使用方法
- shell编程之iptables
- [UWP]使用SpringAnimation创建有趣的动画
- 纯前端JS实现一个登记照改换底色背景色功能
- 【hpuoj】OY问题
- 五子棋Pro-最好玩的五子棋游戏
- oracle的服务配置