解题:国家集训队 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$,那么就把 ...
随机推荐
- UWP ListView 绑定 单击 选中项 颜色
refer: https://www.cnblogs.com/lonelyxmas/p/7650259.html using System; using System.Collections.Gene ...
- 20155223 Exp9 Web安全基础实践
20155223 Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 攻击原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定 ...
- 20155320《网络对抗》Exp4 恶意代码分析
20155320<网络对抗>Exp4 恶意代码分析 [系统运行监控] 使用schtasks指令监控系统运行 首先在C盘目录下建立一个netstatlog.bat文件(由于是系统盘,所以从别 ...
- 谈谈对Python装饰器的理解
装饰器,又名函数修饰符.笔者觉得函数修饰符,这个名字更能直观的反应他的作用. 函数修饰符语法特征 : @ + 修饰符 函数修饰符的装饰对象: 函数修饰符,就是说他修饰的是 ...
- Hadoop开发第3期---Hadoop的伪分布式安装
一.准备工作 1. 远程连接工具的安装 PieTTY 是在PuTTY 基础上开发的,改进了Putty 的用户界面,提供了多语种支持.Putty 作为远程连接linux 的工具,支持SSH 和telne ...
- Yii2 软删除
什么是软删除 后台操作,删除一条记录,不希望真正的从数据库中删除,用个字段标记一下.比如delete_at.默认0.当执行删除操作,更新delete_at为当前时间戳 这样列表显示的时候只查询dele ...
- Jlink使用技巧系列教程索引
近两个月,写写停停,总算完成了这个系列的教程,不容易啊! Jlink使用技巧系列文章: 以下是各文章的链接,直接点击即可进入阅读. Jlink使用技巧之合并烧写文件 Jlink使用技巧之烧写SPI F ...
- C#杂乱知识汇总
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60'
issue: Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60' rea ...
- iOSPush自动隐藏tabbar
只需要在UITabBarController添加控制器的时候调用YZNav初始化,就可以实现tabbar的自动隐藏了. 直接上github地址:https://github.com/YouZhiZhe ...