主席树(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\)的数和小于\( ...
 
随机推荐
- 201421123042 《Java程序设计》第13周学习总结
			
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 答: 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户 ...
 - nyoj 鸡兔同笼
			
鸡兔同笼 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 已知鸡和兔的总数量为n,总腿数为m.输入n和m,依次输出鸡和兔的数目,如果无解,则输出"No an ...
 - PHP冒泡排序、选择排序、插入排序
			
$arr = [1, 8, 7, 5, 4, 2, 11, 9, 20]; 冒泡排序: for ($i = 0; $i < count($arr); $i ++) { for ($j = 0; ...
 - Linq 集合操作符 Except,Intersect,Union
			
IList<string> s1 = new List<string>() { "One", "Two", "Three&qu ...
 - JAVA版exe可执行加密软件
			
1.现在eclipse(myeclipse)中插入以下代码 1.1 MainForm package cee.hui.myfile; import javax.swing.*; import java ...
 - Linux后台运行命令 nohup command > myout.file 2>&1
			
Linux命令后台运行 转自北国的雨,谢谢:http://www.cnblogs.com/lwm-1988/archive/2011/08/20/2147299.html 有两种方式:1. comma ...
 - window.open()参数详解及对浏览器的兼容性
			
因为篇幅,window.open()浏览器的兼容性请点击 这里 Part1:参数详解 window.open(url,name,param) url:即将打开的子窗口的地址:比如 "http ...
 - CentOS 6.5 Tomcat安装及配置
			
1.安装jdk,配置jdk环境(此步骤略过) 2.下载安装tomcat 百度网盘链接: https://pan.baidu.com/s/1Ieejo7TQyzRAVPhQft8Phw 密码: dg2v ...
 - python 评论楼
			
评论楼 从数据库中取出本篇博客的所有评论使用python语句将评论整理成具有层级关系的列表 typename=request.POST.get('typename') comment_list = m ...
 - python--Selectors模块/队列
			
Selectors模块/队列 一 Selectors模块 IO多路复用实现机制 Win: select Linux:select(效率低) poll epoll(最好)默认选择epoll sele ...