2653: middle

链接

分析:

  二分答案+主席树。

  对于中位数的经典做法,就是二分一个数,将小于的变成-1,大于等于的变成+1,那么如果sum>=0(因为+1包括等于),L=mid+1,否则R=mid-1。

  那么考虑二分一个中位数(当然只二分出现过的数即可),然后向上面一样判断。

  因为二分的数字只有n个,可以建立n颗只包含-1和+1的权值线段树,发现第i小的权值线段树与第i+1小的权值线段树只有一个位置不同,所以可以类似可持久化的思路,每次只去建立一条链。

  查询的区间有很多个,不能挨个查询它们的和,由于查询最大值,所以可以再在线段树上维护左端最大子段和,右端最大子段和。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define pa pair<int,int>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
struct Node{
int sum, Lmx, Rmx;
}T[N * ];
int ls[N * ], rs[N * ], Root[N], Index, n;
pa A[N]; Node operator + (const Node &A,const Node &B) {
Node res;
res.sum = A.sum + B.sum;
res.Lmx = max(A.Lmx, A.sum + B.Lmx);
res.Rmx = max(B.Rmx, A.Rmx + B.sum);
return res;
}
void build(int l,int r,int &rt) {
rt = ++Index;
if (l == r) {
T[rt].sum = T[rt].Lmx = T[rt].Rmx = ; return ;
}
int mid = (l + r) >> ;
build(l, mid, ls[rt]); build(mid + , r, rs[rt]);
T[rt] = T[ls[rt]] + T[rs[rt]];
}
void update(int l,int r,int &rt,int pre,int p) {
if (!rt) rt = ++Index;
if (l == r) {
T[rt].sum = T[rt].Lmx = T[rt].Rmx = -; return ;
}
int mid = (l + r) >> ;
if (p <= mid) {
rs[rt] = rs[pre];
update(l, mid, ls[rt], ls[pre], p);
} else {
ls[rt] = ls[pre];
update(mid + , r, rs[rt], rs[pre], p);
}
T[rt] = T[ls[rt]] + T[rs[rt]];
}
Node query(int l,int r,int rt,int L,int R) {
if (L <= l && r <= R) return T[rt];
int mid = (l + r) >> ;
if (R <= mid) return query(l, mid, ls[rt], L, R);
else if (L > mid) return query(mid + , r, rs[rt], L, R);
else return query(l, mid, ls[rt], L, R) + query(mid + , r, rs[rt], L, R);
}
bool check(int x,int l1,int r1,int l2,int r2) {
Node a, b, c; b.sum = ;
if (l2 > r1 + ) b = query(, n, Root[x], r1 + , l2 - );
a = query(, n, Root[x], l1, r1);
c = query(, n, Root[x], l2, r2);
return (a.Rmx + b.sum + c.Lmx) >= ;
}
int main() {
n = read();
for (int i = ; i <= n; ++i) {
A[i].first = read(), A[i].second = i;
}
sort(A + , A + n + );
build(, n, Root[]);
for (int i = ; i <= n; ++i)
update(, n, Root[i], Root[i - ], A[i - ].second);
int c[], m = read(), ans = , pos;
while (m --) {
for (int i = ; i < ; ++i) c[i] = (read() + ans) % n + ;
sort(c, c + );
int l = , r = n;
while (l <= r) {
int mid = (l + r) >> ;
if (check(mid, c[], c[], c[], c[])) pos = mid, l = mid + ;
else r = mid - ;
}
ans = A[pos].first;
printf("%d\n", ans);
}
return ;
}

2653: middle的更多相关文章

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

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

  2. 【BZOJ】2653: middle

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

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

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

  4. BZOJ 2653 middle

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题目大意:多组询问,求左右端点在规定范围内移动所能得到的最大中位数. [分析] 求中 ...

  5. BZOJ 2653: middle 主席树 二分

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

  6. BZOJ 2653 middle | 主席树

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题解: 设答案为ans,把大于等于ans的记为1,小于的记为-1,这样可以知道当前an ...

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

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

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

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

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

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

随机推荐

  1. 如何让chrome浏览器自动翻译

    我用的chrome浏览器,最初用的时候浏览器默认自动翻译英文,我感觉很麻烦.所以我选择了一律不翻译.但是我当我想翻译的的时候又不知道怎么操作.一直郁闷到现在.今天我突然发现了一个方法可以让你的浏览器自 ...

  2. 数据库对比:选择MariaDB还是MySQL?

    作者 | EverSQL 译者 | 无明 这篇文章的目的主要是比较 MySQL 和 MariaDB 之间的主要相似点和不同点.我们将从性能.安全性和主要功能方面对这两个数据库展开对比,并列出在选择数据 ...

  3. mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)

    mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...

  4. eclipse 调试技巧收集

    1  eclipse启动tomcat无法访问 原因:部署路径没有选择 tomcat安装路径 解决:双击,设置server location即可 http://blog.csdn.net/wqjsir/ ...

  5. mac osx 升级到10.10 软件无法打开的问题

    osx升级到10.9.5 和10.10后,很多软件出现无法打开的问题, This patch seems to be corrupted.Please make sure you get your p ...

  6. ZT eoe android4.2 Bluetooth记录01-结构和代码分布

    android4.2 Bluetooth记录01-结构和代码分布 作者:cnhua5更新于 08月21日访问(697)评论(2) 在android4.2中,Google更换了android的蓝牙协议栈 ...

  7. 第一次项目冲刺(Alpha版本)2017/11/17

    一.当天站立式会议 会议内容 1.对数据库的设计的进一步讨论 2.讨论SSH一些配置细节 3.分配今天的任务 二.任务分解图 三.燃尽图 四.心得 刚接触冲刺,一开始任务没有分布很多,大家要一些熟悉的 ...

  8. 【转载】uWSGI配置翻译

    英文原版: http://uwsgi-docs.readthedocs.io/en/latest/Options.html 转载地址: http://www.cnblogs.com/zhouej/ar ...

  9. [装]JMX监控Hadoop

    http://chenjc-it.iteye.com/blog/1539746 实验成功!

  10. Java & Groovy & Scala & Kotlin - 20.Switch 与模式匹配

    Overview 本章主要介绍高级条件语句中的 switch 语句以及其增强版的模式匹配. Java 篇 Switch 特点 Java 中 switch 语句功能类似 if,但是 switch 主要用 ...