考虑二分答案,设为k,将大于等于k的元素设为1,小于的设为-1,如果某一段的和>=0,说明这段的中位数>=k.

对于每组询问,二分完后查询新序列的最大子段和即可。

但是不能开n棵线段树,观察到如果将原序列从小到大排序后,每加一个元素只会修改一个位置的值,所以用个主席树维护最大子段和即可。

#include <cstdio>
#include <algorithm>
using namespace std;
#define lx t[x].l
#define rx t[x].r
#define m ((l+r)>>1)
#define lc lx,l,m
#define rc rx,m+1,r const int N = ;
int n,q,tt,la,l1,r1,l2,r2,c[],a[N],b[N],rt[N];
struct nd {int l,r,s,ls,rs;}t[];
bool cmp(int x, int y) {return a[x] < a[y];} void bd(int &x, int l, int r) {
x = ++tt, t[x].s = t[x].ls = t[x].rs = r-l+;
if(l == r) return;
bd(lc), bd(rc);
} void upd(int lt, int x, int l, int r, int v) {
if(l == r) {t[x].s = t[x].ls = t[x].rs = -; return;}
if(v <= m) rx = t[lt].r, t[x].l = ++tt, upd(t[lt].l, lc, v);
else lx = t[lt].l, t[x].r = ++tt, upd(t[lt].r, rc, v);
t[x].s=t[lx].s+t[rx].s;
t[x].ls=max(t[lx].ls,t[lx].s+t[rx].ls),t[x].rs=max(t[rx].rs,t[rx].s+t[lx].rs);
}
int qry2(int x, int l, int r, int L, int R) {
if(l >= L && r <= R) return t[x].s;
if(L > m) return qry2(rc, L, R);
if(R <= m) return qry2(lc, L, R);
return qry2(lc, L, R)+qry2(rc, L, R);
}
int qry1(int x, int l, int r, int L, int R) {
if(l >= L && r <= R) return t[x].rs;
if(L > m) return qry1(rc, L, R);
if(R <= m) return qry1(lc, L, R);
return max(qry1(rc,L,R),qry1(lc,L,R)+qry2(rc,L,R));
}
int qry3(int x, int l, int r, int L, int R) {
if(l >= L && r <= R) return t[x].ls;
if(L > m) return qry3(rc, L, R);
if(R <= m) return qry3(lc, L, R);
return max(qry3(lc,L,R),qry3(rc,L,R)+qry2(lc,L,R));
} int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &a[i]), b[i] = i;
sort(b+, b++n, cmp), bd(rt[], , n);
for(int i = ; i <= n; i++) rt[i] = ++tt, upd(rt[i-], rt[i], , n, b[i]);
scanf("%d", &q);
while(q--) {
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
c[] = (l1+la)%n+, c[] = (r1+la)%n+, c[] = (l2+la)%n+, c[] = (r2+la)%n+;
sort(c, c+), l1 = c[], r1 = c[], l2 = c[], r2 = c[];
int l = , r = n;
while(l < r) {
int t1 = qry1(rt[m],,n,l1,r1)+qry3(rt[m],,n,l2,r2),t2;
if(r1+ < l2) t2 = qry2(rt[m],,n,r1+,l2-); else t2 = ;
if(t1+t2 >= ) l = m+; else r = m;
}
printf("%d\n", la=a[b[l]]);
}
return ;
}

主席树(BZOJ2653)的更多相关文章

  1. BZOJ2653 middle(二分答案+主席树)

    与中位数有关的题二分答案是很常用的trick.二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0. 由于每个位置是1还是-1并不固定,似乎不是很好算.考 ...

  2. 【BZOJ2653】Middle(主席树)

    [BZOJ2653]Middle(主席树) 题面 BZOJ 洛谷 Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你 ...

  3. BZOJ2653 middle 【主席树】【二分】*

    BZOJ2653 middle Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样 ...

  4. [bzoj2653][middle] (二分 + 主席树)

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

  5. 【bzoj2653】【middle】【主席树+二分答案】

    Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...

  6. [BZOJ2653]middle 主席树+二分

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

  7. BZOJ2653 middle 【二分 + 主席树】

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

  8. 【BZOJ2653】middle(主席树,二分)

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

  9. 【洛谷2839/BZOJ2653】middle(主席树)

    题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...

随机推荐

  1. maven(二)创建工程

    创建动态Web工程打war包 ​ File→new→Maven Project→勾上create a simple project→然后next> ​ 然后会报一下的错 ​ 解决 ​ 创建jav ...

  2. ajax的四种type类型

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  3. 从PRISM开始学WPF(五)MVVM(一)ViewModel?

    从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...

  4. 《javascript设计模式与开发实践》阅读笔记(16)—— 状态模式

    状态模式 会区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变.比如电灯的开关是开还是关,在外界的表现就完全不同. 电灯例子 按照常规思路,实现一个电灯就是构造一个电灯类,然后指定一下它的 ...

  5. Session 和 Cookie 区别

    会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.==Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用 ...

  6. EasyUI内容页Tabs。

    html: <div data-options="region:'center'"> <div id="tabs" class="e ...

  7. JS 上传图片时实现预览

    网页中一张图片可以这样显示: <img src="http://www.letuknowit.com/images/wg.png"/>也可以这样显示:<img s ...

  8. docker安装+测试环境的搭建---

    漏洞演练环境docker地址:http://vulhub.org/#/environments/ 环境:kali-linux-2017.2-amd64.iso 一.docker安装 1.先更新一波源: ...

  9. hadoop2.6.0实践:004 启动伪分布式hadoop的进程

    [hadoop@LexiaofeiMaster hadoop-2.6.0]$ start-dfs.shStarting namenodes on [localhost]localhost: start ...

  10. Django—中间件

    中间件简介 什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功 ...