解题:国家集训队 Middle
求中位数的套路:二分,大于等于的设为1,小于的设为-1
于是可以从小到大排序后依次加入可持久化线段树,这样每次只会变化一个位置
那左右端点是区间怎么办?
先把中间的算上,然后维护每个区间左右两侧最大子段和,左右和右左拼起来即可
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=1e7+,inf=1e9;
int num[N],root[N],son[M][],sum[M],lsum[M],rsum[M],qry[];
int n,m,t1,t2,t3,t4,rd,tot,ans; pair<int,int> mem[N];
void Pushup(int nde)
{
int ls=son[nde][],rs=son[nde][];
sum[nde]=sum[ls]+sum[rs];
lsum[nde]=max(lsum[ls],sum[ls]+lsum[rs]);
rsum[nde]=max(rsum[rs],sum[rs]+rsum[ls]);
}
int Pre(int l,int r)
{
int nde=++tot;
if(l==r)
sum[nde]=lsum[nde]=rsum[nde]=;
else
{
int mid=(l+r)>>;
son[nde][]=Pre(l,mid);
son[nde][]=Pre(mid+,r);
Pushup(nde);
}
return nde;
}
int Insert(int pre,int l,int r,int pos,int tsk)
{
int nde=++tot;
son[nde][]=son[pre][];
son[nde][]=son[pre][];
if(l==r)
sum[nde]=lsum[nde]=rsum[nde]=tsk;
else
{
int mid=(l+r)>>;
if(pos<=mid) son[nde][]=Insert(son[pre][],l,mid,pos,tsk);
else son[nde][]=Insert(son[pre][],mid+,r,pos,tsk); Pushup(nde);
}
return nde;
}
int Query1(int nde,int l,int r,int ll,int rr)
{
if(l==ll&&r==rr)
return sum[nde];
else
{
int mid=(l+r)>>;
if(mid>=rr) return Query1(son[nde][],l,mid,ll,rr);
else if(mid<ll) return Query1(son[nde][],mid+,r,ll,rr);
else return Query1(son[nde][],l,mid,ll,mid)+Query1(son[nde][],mid+,r,mid+,rr);
}
}
int Query2(int nde,int l,int r,int ll,int rr)
{
if(l==ll&&r==rr)
return lsum[nde];
else
{
int mid=(l+r)>>;
if(mid>=rr) return Query2(son[nde][],l,mid,ll,rr);
else if(mid<ll) return Query2(son[nde][],mid+,r,ll,rr);
else return max(Query2(son[nde][],l,mid,ll,mid),Query1(son[nde][],l,mid,ll,mid)+Query2(son[nde][],mid+,r,mid+,rr));
}
}
int Query3(int nde,int l,int r,int ll,int rr)
{
if(l==ll&&r==rr)
return rsum[nde];
else
{
int mid=(l+r)>>;
if(mid>=rr) return Query3(son[nde][],l,mid,ll,rr);
else if(mid<ll) return Query3(son[nde][],mid+,r,ll,rr);
else return max(Query3(son[nde][],mid+,r,mid+,rr),Query1(son[nde][],mid+,r,mid+,rr)+Query3(son[nde][],l,mid,ll,mid));
}
}
bool Check(int x)
{
int ret=;
if(qry[]+<=qry[]-) ret+=Query1(root[x],,n,qry[]+,qry[]-);
ret+=Query3(root[x],,n,qry[],qry[])+Query2(root[x],,n,qry[],qry[]);
return ret>=;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&num[i]),mem[i]=make_pair(num[i],i);
sort(mem+,mem++n),root[]=Pre(,n);
for(int i=;i<=n;i++)
root[i]=Insert(root[i-],,n,mem[i-].second,-);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
for(int j=;j<=;j++)
scanf("%d",&rd),qry[j]=(rd+ans)%n+;
sort(qry+,qry+);
int l=,r=n,lst=;
while(l<=r)
{
int mid=(l+r)>>;
if(Check(mid)) l=mid+,lst=mid;
else r=mid-;
}
printf("%d\n",ans=mem[lst].first);
}
return ;
}
解题:国家集训队 Middle的更多相关文章
- [国家集训队]middle 解题报告
[国家集训队]middle 主席树的想法感觉挺妙的,但是这题数据范围这么小,直接分块草过去不就好了吗 二分是要二分的,把\(<x\)置\(-1\),\(\ge x\)的置\(1\),于是我们需要 ...
- [国家集训队]middle
[国家集训队]middle 题目 解法 开\(n\)颗线段树,将第\(i\)颗线段树中大于等于第\(i\)小的数权值赋为1,其他的则为-1,对于每个区间维护一个区间和,最大前缀和,最大后缀和. 然后二 ...
- P2839 [国家集训队]middle
P2839 [国家集训队]middle 好妙的题啊,,,, 首先二分一个答案k,把数列里>=k的数置为1,=0就是k>=中位数,<0就是k<中位数 数列的最大和很好求哇 左边的 ...
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
- 【LG2839】[国家集训队]middle
[LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\( ...
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
- luogu2839 [国家集训队]middle
题目链接:洛谷 题目大意:给定一个长度为$n$的序列,每次询问左端点在$[a,b]$,右端点在$[c,d]$的所有子区间的中位数的最大值.(强制在线) 这里的中位数定义为,对于一个长度为$n$的序列排 ...
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
- Luogu 2839 [国家集训队]middle
感觉这题挺好的. 首先对于中位数最大有一个很经典的处理方法就是二分,每次二分一个数组中的下标$mid$,然后我们把$mid$代回到原来的数组中检查,如果一个数$a_{i} \geq mid$,那么就把 ...
随机推荐
- 28 个 C/C++ 开源 JSON 程序库性能及标准符合程度评测
28 个 C/C++ 开源 JSON 程序库性能及标准符合程度评测 坊间有非常多的 C/C++ JSON 库,怎么选择是一个难题. [nativejson-benchmark](https://git ...
- 自定义CCNode
对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类. 自定义Touch事件处理类重要 ...
- C#精华面试题及答案 三
PS.学了两三年的软件开发到头来发现连一些基本的东西都没掌握,通过面试题来检验自己的水平,让学习变得更加有方向性,也为将来择业而打下基础,不至于到时候手忙脚乱. 一.选择,填空题 1. 在ADO.NE ...
- 【中间件】Redis 实战之主从复制、高可用、分布式
目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...
- Zabbix实战-简易教程--大型分布式监控系统实现Agent批量快速接入
一.分布式架构 相信使用zabbix的大神都熟悉他的分布式架构,分布式的优势相当明显,分而治之.比如目前我的架构图如下: 那么,对将要接入监控系统的任何一个agent如何快速定位,并进行接入呢? 问 ...
- 你应该知道Go语言的几个优势
要说起GO语言的优势,我们就得从GO语言的历史讲起了-- 本文由腾讯技术工程官方号发表在腾讯云+社区 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Grie ...
- 异步编程之asyncio简单介绍
引言: python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板. as ...
- Final版本互评——杨老师粉丝群《PinBall》
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着民族自信的觉醒,民主文化越来越受到重视,语文在高考中的比重也不断增加,在这种大环境下,成 ...
- 《Linux内核分析》第二周学习报告
<Linux内核分析>第二周学习报告 ——操作系统是如何工作的 姓名:王玮怡 学号:20135116 第一节 函数调用堆栈 一.三个法宝 二.深入理解函数调用堆栈 三.参数传递与局部变量 ...
- 20170831 php
今天开始学习php 发现这个网站教程感觉入门很轻松 http://www.php.cn/code/25.html 配置环境遇到了端口占用的问题 解决方案: http://www.weekdian.co ...