考虑二分答案,设为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. Spring-Data-JPA整合MySQL和配置

    一.简介 (1).MySQL是一个关系型数据库系统,是如今互联网公司最常用的数据库和最广泛的数据库.为服务端数据库,能承受高并发的访问量. (2).Spring-Data-Jpa是在JPA规范下提供的 ...

  2. electron打包vue项目

    electron是什么 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并 ...

  3. ctf变量覆盖漏洞:

    1.变量覆盖: ①:针对extract函数的变量覆盖漏洞: <?php @error_reporting(E_ALL^E_NOTICE); require('config.php'); if($ ...

  4. Python内置函数(61)——eval

    英文文档: eval(expression, globals=None, locals=None) The arguments are a string and optional globals an ...

  5. spring MVC框架入门(外加SSM整合)

    spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...

  6. SpringMVC(十):SpringMVC 处理输出模型数据之Map及Model

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...

  7. SpringMVC(五):@RequestMapping下使用@RequestParam绑定请求参数值

    在处理方法入参使用@RequestParam可以把请求参数传递给请求方法,@RequestParam包含的属性值: --- value :参数名称 --- required :是否必须,默认为true ...

  8. POJ-1062 昂贵的聘礼---Dijkstra+枚举上界

    题目链接: https://vjudge.net/problem/POJ-1062 题目大意: 中文题 思路: 1是终点,可以额外添加一个源点0,0到任意一节点的距离就是这个点的money,最终求的是 ...

  9. scrapy爬取中关村在线手机频道

    # -*- coding: utf-8 -*- import scrapy from pyquery import PyQuery as pq from zolphone.items import Z ...

  10. MySQL操作与修改表

    插入数据(insert) insert语句的3个主要组成部分: 所要插入数据的表的名称: 表终需要使用的列的名称: 需要插入到列的值. 数字型主键生成机制 数字型主键生成机制,除了随机选择数字外,还可 ...