主席树(BZOJ2653)
考虑二分答案,设为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)的更多相关文章
- BZOJ2653 middle(二分答案+主席树)
与中位数有关的题二分答案是很常用的trick.二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0. 由于每个位置是1还是-1并不固定,似乎不是很好算.考 ...
- 【BZOJ2653】Middle(主席树)
[BZOJ2653]Middle(主席树) 题面 BZOJ 洛谷 Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你 ...
- BZOJ2653 middle 【主席树】【二分】*
BZOJ2653 middle Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样 ...
- [bzoj2653][middle] (二分 + 主席树)
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...
- [BZOJ2653]middle 主席树+二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2042 Solved: 1123[Submit][Status][Disc ...
- BZOJ2653 middle 【二分 + 主席树】
题目 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c ...
- 【BZOJ2653】middle(主席树,二分)
题意:一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[ ...
- 【洛谷2839/BZOJ2653】middle(主席树)
题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...
随机推荐
- sqlserver学习_01
sqlserver的学习成长之路,每一个技术的学习过程都是值得让人回味的,现在百度上关于sqlser的资料很多,但是都太杂,希望能为大家分享一点简单易懂的干货,跟大家一起进步学习. 一.建表 1.创建 ...
- python之路--day10-闭包函数
1.命名关键字参数 格式:在*后面的参数都是命名关键字参数 特点: 1.必须被传值 2.约束函数的调用者必须按照key=value的形式传值 3.约束函数的调用者必须用我们指定的key名 def au ...
- c# gridview 新增行
string[] newRow = {"long","d","b"}; Gridview.Rows.Insert(Gridview.Rows ...
- Thinkphp框架部署步骤
Thinkphp框架部署步骤 thinkphp框架部署起来简单,但是由于步骤较多也容易遗忘: 这是安装了集成环境后的一个www根目录结构: 然后需要在这个目录下面创建一个文件夹做项目:thinkphp ...
- 第三章 jQuery中的事件与动画
第三章jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.wind ...
- typedef 使用
1,C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字. #include<stdio.h> typedef unsigned char BYTE; int mai ...
- android 运行时异常捕获
1,将运行时异常捕获并存到手机SD卡上 可以直接使用logcat 命令Runtime.getRuntime().exec("logcat -f "+ file.getAbsolut ...
- python/MySQL(索引、执行计划、BDA、分页)
---恢复内容开始--- python/MySQL(索引.执行计划.BDA.分页) MySQL索引: 所谓索引的就是具有(约束和加速查找的一种方式) 创建索引的缺点是对数据进行(修改.更新.删除) ...
- 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
- Ubuntu 16.04安装Matlab 2016b教程
由于代码需要依赖Linux环境,只好尝试着装MATLAB,然而各种问题接踵而至,开始了由MATLAB引发的三天Linux探寻之旅-- 下载Matlab 2016b for Linux https:// ...