P2839 [国家集训队]middle(二分 套 主席树)

P2839 [国家集训队]middle

有一个长度为nnn的序列,有mmm次询问,每次询问a,b,c,da, b, c, da,b,c,d,为l∈[a,b],r∈[c,d]l \in [a, b], r \in [c, d]l[a,b],r[c,d][l,r][l, r][l,r]区间的中位数最大是多少,强制在线,1≤n≤20000,1≤m≤250001 \leq n \leq 20000, 1 \leq m \leq 250001n20000,1m25000

由于有a≤b≤c≤da \leq b \leq c \leq dabcd,分三个区间讨论[a,b],[b+1,c−1],[c,d][a, b], [b + 1, c - 1], [c, d][a,b],[b+1,c1],[c,d],其中[b+1,c−1][b + 1, c - 1][b+1,c1]这个区间是必选的,[a,b],[c,d][a, b], [c, d][a,b],[c,d]这俩个区间可选可不选,

我们考虑二分答案,对于mid≤aimid \leq a_imidai的我们设置为111,否则我们设置为−1-11,对于选定的区间,如果中位数是等于midmidmid的,则一定有区间和>=0>= 0>=0

由于我们要使区间中位数尽可能地大,所以我们定然是在[a,b][a, b][a,b]上选一个点ppp1,−11, -11,1序列上使得[p,b][p, b][p,b]的和最大,在[c,d][c, d][c,d]上选定一个点qqq也是如此。

如此做的话,单次询问复杂度将会是O(nlog⁡nlog⁡n)O(n \log n \log n )O(nlognlogn)的,有没有办法高效来完成呢,整体二分似乎是一个比较好的方法,但是这题要求在线求解,,,

整理一下上面我们所需要的值,[b+1,c−1][b + 1, c - 1][b+1,c1]的区间和,[a,b][a, b][a,b]区间的后缀最大值,[c,d][c, d][c,d]区间的前缀最大值,

对于任意一个区间的后缀最大值,前缀最大值都可用线段树维护,同样的区间和也可以用线段树维护,

目前我们所需的就是对于任何一个midmidmid,我们要精确地知道对于某段区间地前缀最大,前缀最小,区间和,

这里就可以考虑用主席树,对每个二分地midmidmid都建立一颗主席树,对于每次二分地midmidmid是否合法,我们只要到对应地主席树上查找即可。

#include <bits/stdc++.h>using namespace std;const int N = 2e4 + 10;struct Seg {int l, r, sum;
}t[N << 6];int root[N], ls[N << 6], rs[N << 6], num;int a[N], b[N], n, m;Seg operator + (Seg a, Seg b) {Seg ans;ans.sum = a.sum + b.sum;ans.l = max(a.l, a.sum + b.l);ans.r = max(b.r, b.sum + a.r);return ans;
}void push_up(int rt) {t[rt] = t[ls[rt]] + t[rs[rt]];
}void build(int &rt, int l, int r) {rt = ++num;if (l == r) {t[rt] = {-1, -1, -1};return ;}int mid = l + r >> 1;build(ls[rt], l, mid);build(rs[rt], mid + 1, r);push_up(rt);
}void update(int &rt, int pre, int l, int r, int x) {rt = ++num, ls[rt] = ls[pre], rs[rt] = rs[pre];if (l == r) {t[rt] = {1, 1, 1};return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x);}else {update(rs[rt], rs[pre], mid + 1, r, x);}push_up(rt);
}Seg query(int rt, int l, int r, int L, int R) {if (l >= L && r <= R) {return t[rt];}int mid = l + r >> 1;if (L <= mid && R > mid) {return query(ls[rt], l, mid, L, R) + query(rs[rt], mid + 1, r, L, R);}else if (L <= mid) {return query(ls[rt], l, mid, L, R);}else {return query(rs[rt], mid + 1, r, L, R);}
}int aa, bb, cc, dd;bool judge(int x) {int res = 0;res += query(root[x], 1, n, aa, bb).r;if (bb + 1 <= cc - 1) {res += query(root[x], 1, n, bb + 1, cc - 1).sum;}res += query(root[x], 1, n, cc, dd).l;return res >= 0;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);b[i] = i;}scanf("%d", &m);build(root[n + 1], 1, n);sort(b + 1, b + 1 + n, [&] (int x, int y) {return a[x] < a[y];});for (int i = n; i >= 1; i--) {update(root[i], root[i + 1], 1, n, b[i]);}int ans = 0;for (int i = 1; i <= m; i++) {scanf("%d %d %d %d", &aa, &bb, &cc, &dd);aa = (aa + ans) % n + 1, bb = (bb + ans) % n + 1;cc = (cc + ans) % n + 1, dd = (dd + ans) % n + 1;int tmp[5] = {0, aa, bb, cc, dd};sort(tmp + 1, tmp + 4 + 1);aa = tmp[1], bb = tmp[2], cc = tmp[3], dd = tmp[4];int l = 1, r = n;while (l < r) {int mid = l + r + 1 >> 1;if (judge(mid)) {l = mid;}else {r = mid - 1;}}ans = a[b[l]];printf("%d\n", ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core 使用HttpClientFactory Polly实现熔断降级

前言在NET Core2.1后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式通常不是最好的选择。处理HttpClient,底层socket套接字不会立即释放。该HttpClient类是未多个请求重复使用而创建的。…

.NET生态系统概览

本文要点.NET 5 预计会在 2020 年发布&#xff0c;届时将统一所有.NET 平台。在进行特性开发时优先考虑性能。C#语言的发展直接推动了开发者的采用。开源社区让.NET 生态系统变得更好。2002 年&#xff0c;.NET 发布。在接下来的 12 年多时间里&#xff0c;.NET 开发社区以看似…

P1848 [USACO12OPEN]Bookshelf G(线段树优化 DP)

P1848 [USACO12OPEN]Bookshelf G 有nnn间物品&#xff0c;每个物品有两个属性Wi,HiW_i, H_iWi​,Hi​&#xff0c;宽度跟高度&#xff0c;要求把这nnn件物品划分成若干连续的组&#xff0c;每组内∑Wi≤L\sum\limits W_i \leq L∑Wi​≤L&#xff0c;并且要求最小化每组最大高…

Java 实现 FTP 服务

1、FTP简介 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的…

L. Continuous Intervals(单调栈 + 线段树 + 思维)

L. Continuous Intervals 给定一个长度为nnn的数组&#xff0c;问里面有多少个区间[l,r][l, r][l,r]&#xff0c;满足&#xff0c;对这个区间排序后&#xff0c;两两差值$ \leq 1$&#xff0c;输出区间个数。 如果说区间[l,r][l, r][l,r]是符合要求的&#xff0c;则满足max(a…

Azure Application Insights REST API使用教程

本文是Azure Application Insights REST API的简单介绍&#xff0c;并会包含一个通过Python消费API的示例/小工具。新加入的team中的一项工作是制作日常的运维报表&#xff0c;制作方式是手工前往portal.azure.com&#xff0c;在网页中多次执行不同的查询语句、导出excel&#…

用Java Socket实现SMTP邮件发送

目录&#xff1a; 1、邮件基础概念2、Java Mail API介绍3、收发邮件代码示例 PS&#xff1a;如果你想直接拿代码用&#xff0c;可以直接跳到第3部分。 ** 一、邮件基础概念 ** 1.1 邮件服务器和电子邮箱 要在Internet上提供电子邮件功能&#xff0c;必须有专门的电子邮件…

微软开源新字体Cascadia Code,源于Windows Terminal

微软开源了一套新的字体 Cascadia Code。Cascadia Code 是微软在 5 月份的 Build 大会上宣布推出的等宽字体&#xff0c;微软介绍它是与新的终端 Windows Terminal 一起开发的&#xff0c;官方建议将其与终端应用和 VS、VS Code 等文本编辑器一起使用。Cascadia Code 为命令行和…

C. Safe Distance(二分 + 并查集)

C. Safe Distance&#xff08;二分 并查集&#xff09; 给定一个XYX \times YXY的矩形&#xff0c;里面有n,(1≤n≤1000)n,(1 \leq n \leq 1000)n,(1≤n≤1000)个点&#xff0c;我们要从点(0,0)(0, 0)(0,0)走到(X,Y)(X, Y)(X,Y)&#xff0c;我们要使过程中与这nnn个点的最小距…

进程间通讯的7种方式

1、常见的通信方式 管道pipe&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO&#xff1a;有名管道也是半双工的通信方式&#xff0c;但是它允许无亲缘…

官宣!VS Code Python 全新功能在 PyCon China 全球首发!

北京时间 2019 年 9 月 21 日&#xff0c;PyCon China 2019 在上海举行。在下午的演讲中&#xff0c;来自微软开发工具事业部的资深研发工程师在演讲中&#xff0c;我们看到了 Azure Notebook 与 VS Code 对 Python 的强大的支持。然而&#xff0c;鱼和熊掌似乎不可兼得。Jupyt…

什么是CDN

一、cdn简介 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其目的是通过在现有的internet中增加一层新的网络架构&#xff0c;将网站的内容发布到最接近用户的网络边缘&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的响应速度。…

数列递推(牛客练习赛83)(数学、分块)

数列递推 给定f(0)f(0)f(0)&#xff0c;定义fn∑i1nf(nmodi)f_n \sum\limits_{i 1} ^{n} f_{(n \mod i)}fn​i1∑n​f(nmodi)​&#xff0c;求f1,f2,f3,…,fn−1,fnf_1, f_2, f_3, \dots, f_{n - 1}, f_{n}f1​,f2​,f3​,…,fn−1​,fn​。 ∑i1nf(nmodi)∑i1nf(n−nii)\su…

DNS基础

域名注册完成后首先需要做域名解析&#xff0c;域名解析就是把域名指向网站所在服务器的IP&#xff0c;让人们通过注册的域名可以访问到网站。IP地址是网络上标识服务器的数字地址&#xff0c;为了方便记忆&#xff0c;使用域名来代替IP地址。域名解析就是域名到IP地址的转换过…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础介绍

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址: https://liningit.github.io/LnskyDB/开源地址: https://github.com/liningit/LnskyDBnuget地址: https://www.nuget.org/packages/LnskyDB…

CF1422F Boring Queries(ST表 + 主席树)

CF1422F Boring Queries 给定一个长度为nnn的数组a,(1≤ai≤2105)a,(1 \leq a_i \leq 2 \times 10 ^ 5)a,(1≤ai​≤2105)&#xff0c;有mmm次询问&#xff0c;每次询问给定l,rl, rl,r&#xff0c;要我们求区间[l,r][l, r][l,r]&#xff0c;aia_iai​的lcmlcmlcm&#xff0c;强…

高性能最终一致性框架Ray之基本概念原理

一、Actor介绍Actor是一种并发模型&#xff0c;是共享内存并发模型的替代方案。共享内存模型的缺点&#xff1a;共享内存模型使用各种各样的锁来解决状态竞争问题&#xff0c;性能低下且让编码变得复杂和容易出错。共享内存受限于单节点的服务器资源限制。Actor模型的优点&…

B.The Tortoise and the Hare 长春

B. The Tortoise and the Hare 给定一个长度为nnn的数组a,(1≤ai<m)a, (1 \leq a_i < m)a,(1≤ai​<m)&#xff0c;mmm是一个给定的数(1≤m≤109)(1 \leq m \leq 10 ^ 9)(1≤m≤109)&#xff0c;有QQQ次操作&#xff0c;分为两类&#xff1a; 给定u,v,(1≤u≤n,1≤v…

漫画:程序员带娃日常(1)

我是一名IT界资深人士做过乙方苦哈哈做过甲方做过项目、搞点管理做过培训、也上台演讲不过现在最大挑战、交期最长的项目是。。。带 娃娃子啊&#xff0c;爸爸也是第一次当爸爸&#xff0c;要请你多多指教啦&#xff01;1“小刘&#xff0c;把这个需求细化一下。”“兄弟们&…

L. Coordinate Paper(CCPC 长春)构造

L. Coordinate Paper 构造一个长度为nnn的序列aaa&#xff0c;满足ai≥0a_i \geq 0ai​≥0&#xff0c;∑i1nais\sum\limits_{i 1} ^{n} a_i si1∑n​ai​s&#xff0c;对于任意的i∈[1,n−1]i \in [1, n - 1]i∈[1,n−1]&#xff0c;都有ai−ai1korai1−ai1a_i - a_{i 1} …