考虑二分答案,设为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. sqlserver学习_01

    sqlserver的学习成长之路,每一个技术的学习过程都是值得让人回味的,现在百度上关于sqlser的资料很多,但是都太杂,希望能为大家分享一点简单易懂的干货,跟大家一起进步学习. 一.建表 1.创建 ...

  2. python之路--day10-闭包函数

    1.命名关键字参数 格式:在*后面的参数都是命名关键字参数 特点: 1.必须被传值 2.约束函数的调用者必须按照key=value的形式传值 3.约束函数的调用者必须用我们指定的key名 def au ...

  3. c# gridview 新增行

    string[] newRow = {"long","d","b"}; Gridview.Rows.Insert(Gridview.Rows ...

  4. Thinkphp框架部署步骤

    Thinkphp框架部署步骤 thinkphp框架部署起来简单,但是由于步骤较多也容易遗忘: 这是安装了集成环境后的一个www根目录结构: 然后需要在这个目录下面创建一个文件夹做项目:thinkphp ...

  5. 第三章 jQuery中的事件与动画

    第三章jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.wind ...

  6. typedef 使用

    1,C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字. #include<stdio.h> typedef unsigned char BYTE; int mai ...

  7. android 运行时异常捕获

    1,将运行时异常捕获并存到手机SD卡上 可以直接使用logcat 命令Runtime.getRuntime().exec("logcat -f "+ file.getAbsolut ...

  8. python/MySQL(索引、执行计划、BDA、分页)

    ---恢复内容开始--- python/MySQL(索引.执行计划.BDA.分页) MySQL索引: 所谓索引的就是具有(约束和加速查找的一种方式)   创建索引的缺点是对数据进行(修改.更新.删除) ...

  9. 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

    在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

  10. Ubuntu 16.04安装Matlab 2016b教程

    由于代码需要依赖Linux环境,只好尝试着装MATLAB,然而各种问题接踵而至,开始了由MATLAB引发的三天Linux探寻之旅-- 下载Matlab 2016b for Linux https:// ...