题意:

左端点在[a,b],右端点在[c,d],求这个线段里中位数(上取整)最大值

思路:

对数组离散化,对每一个值建中位数的可持久化线段树(有重复也没事),就是对于root[i],大于等于i的值为1,小于的为-1,

从小到大插入可持久化线段树即可

如果中位数为m,那么从左端点到右端点[l,r]的序列和应该>=0,我们只需要二分这个m检查是不是序列和>=0即可

满足左端点在[a,b],右端点在[c,d]的子序列和的最大值,就是我们在用线段树维护最大子序和时的

[b+1,c-1]的sum+[a,b]的maxr+[c,d]的maxl

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
//#define lc root<<1
//#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 2e5+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); int n;
PI a[maxn];
int q;
vector<ll>v;
int getid(ll x){
return lower_bound(v.begin(), v.end(), x)-v.begin()+;
}
bool cmp(PI a, PI b){
if(a.fst==b.fst)return a.sc<b.sc;
return a.fst<b.fst;
}
int root[maxn];
struct Node{
int maxl,maxr;
int sum;
}node[maxn*];
int ls[maxn],rs[maxn];
int tot,totn;
void build(int l, int r, int &root){
root = ++tot;
int mid = (l+r)>>;
if(l==r){
node[root].maxl=node[root].maxr=node[root].sum=;
return;
}
build(l, mid, ls[root]);
build(mid+, r, rs[root]);
node[root].maxl=max(node[ls[root]].sum+node[rs[root]].maxl, node[ls[root]].maxl);
node[root].maxr=max(node[rs[root]].sum+node[ls[root]].maxr, node[rs[root]].maxr);
node[root].sum=node[ls[root]].sum+node[rs[root]].sum;
return;
}
void insert(int lst, int &now, int l, int r, int p){
now = ++tot;
ls[now]=ls[lst];
rs[now]=rs[lst];
node[now] = node[lst];
int mid = (l+r)>>;
if(l==r){
node[now].maxl=node[now].maxr=node[now].sum=-;
return;
}
if(p<=mid)insert(ls[lst], ls[now], l, mid, p);
else insert(rs[lst], rs[now], mid+, r, p);
node[now].maxl=max(node[ls[now]].sum+node[rs[now]].maxl, node[ls[now]].maxl);
node[now].maxr=max(node[rs[now]].sum+node[ls[now]].maxr, node[rs[now]].maxr);
node[now].sum=node[ls[now]].sum+node[rs[now]].sum;
}
Node query(int ql, int qr, int l, int r, int now){ int mid = (l+r)>>;
if(l==ql&&r==qr){
return node[now];
}
else if(mid>=qr){
return query(ql, qr, l, mid, ls[now]);
}
else if(mid<ql){
return query(ql, qr, mid+, r, rs[now]);
}
else{
Node ans;
Node lc=query(ql,mid,l,r,now);
Node rc=query(mid+,qr,l,r,now);
ans.sum=lc.sum+rc.sum;
ans.maxl=max(lc.sum+rc.maxl,lc.maxl);
ans.maxr=max(rc.sum+lc.maxr,rc.maxr);
return ans;
}
}
void dfs(int x){
printf("%d %d %d %d %d %d\n",x,ls[x],rs[x],node[x].sum,node[x].maxl,node[x].maxr);
if(ls[x])dfs(ls[x]);
if(rs[x])dfs(rs[x]);
}
int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d" ,&a[i].fst);
a[i].sc=i;
v.pb(a[i].fst);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(),v.end()),v.end());
totn=v.size();
int lstans = ;
int tmp[];
sort(a+,a++n,cmp);
build(,n,root[]);
for(int i = ; i <= n; i++){
insert(root[i-],root[i],,n,a[i].sc);
}int q;
//dfs(root[4]);
scanf("%d", &q);
while(q--){
for(int i = ; i <= ; i++){
scanf("%d", &tmp[i]);
tmp[i]=(tmp[i]+lstans)%n;
}
sort(tmp+,tmp++);
int l = ;
int r = n+;
int ans = ; while(l<=r){
int mid = (l+r)>>;
int res=max(query(tmp[]+,tmp[]+-,,n,root[mid-]).maxr,);
res+=query(tmp[]+,tmp[]+,,n,root[mid-]).sum;
res+=max(query(tmp[]++,tmp[]+,,n,root[mid-]).maxl,);
if(res>=){
ans=mid;
l=mid+;
}
else r = mid-;
}
printf("%d\n",lstans=v[ans-]);
}
return ;
}
/*
5
2 4 1 5 3
3
3 1 0 2
2 3 1 4
3 1 4 0 5
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0
*/

BZOJ 2653 middle (可持久化线段树+中位数+线段树维护最大子序和)的更多相关文章

  1. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  2. bzoj 2653: middle (主席树+二分)

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2522  Solved: 1434[Submit][Status][Disc ...

  3. BZOJ 2653: middle(主席树+二分答案)

    传送门 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案.但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做 ...

  4. bzoj 2653 middle (可持久化线段树)

    middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1981  Solved: 1097[Submit][Status][Discuss] D ...

  5. BZOJ 2653 middle 二分答案+可持久化线段树

    题目大意:有一个序列,包含多次询问.询问区间左右端点在规定区间里移动所得到的最大中位数的值. 考虑对于每个询问,如何得到最优区间?枚举显然是超时的,只能考虑二分. 中位数的定义是在一个序列中,比中位数 ...

  6. BZOJ 2653: middle [主席树 中位数]

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

  7. bzoj 2653 middle 二分答案 主席树判定

    判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好 但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为 ...

  8. BZOJ 2653: middle 主席树 二分

    https://www.lydsy.com/JudgeOnline/problem.php?id=2653 因为是两个方向向外延伸所以不能对编号取前缀和(这里只有前缀和向后传递的性质,不是实际意义的和 ...

  9. bzoj 2653 middle(主席树)

    题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...

随机推荐

  1. iscsi,nfs

    存储概述 存储的目标 存储是根据不同的应用环境通过采取合理.安全.有效的方式将数据保存到某些介质上并能保证有效的访问. 一方面它是数据临时或长期驻留的物理媒介. 另一方面,它是保证数据完整安全存放的方 ...

  2. HTTP,来一个详细的学习。

    HTTP 认识 HTTP 首先你听的最多的应该就是 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),这你一定能说出来,但是这样还不够,假如你是大厂面试官,这 ...

  3. 点分治 (等级排) codeforces 321C

    Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, has n cities connected ...

  4. mysql累加、累减

    累加 先上表结构: CREATE TABLE `abc` ( `jidu` ) NOT NULL AUTO_INCREMENT, `jine` ) DEFAULT NULL, PRIMARY KEY ...

  5. 异常java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;

    java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava ...

  6. 洛谷P3335 [ZJOI2013]蚂蚁寻路

    题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...

  7. 【WPF学习】第十三章 理解路由事件

    每个.NET开发人员都熟悉“事件”的思想——当有意义的事情发生时,由对象(如WPF元素)发送的用于通知代码的消息.WPF通过事件路由(event routing)的概念增强了.NET事件模型.事件路由 ...

  8. 深入学习MySQL 01 一条查询语句的执行过程

    在学习SpringCloud的同时,也在深入学习MySq中,听着<mysql45讲>,看着<高性能MySQL>,本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处 ...

  9. 【java面试】Web篇

    1.AJAX创建步骤 step1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象:  step2. 创建一个新的HTTP请求,并指定改HTTP请求的方法.URL以及验证信息:  s ...

  10. latex2e

    classs and packages 这一节介绍新的latex文档结构, 以及新的文件类型: classs and packages 类和包是什么? lext 2.09和latex2e的主要差别就在 ...