【BZOJ】2653: middle
2653: middle
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 2381 Solved: 1340
[Submit][Status][Discuss]
Description
Input
Output
Q行依次给出询问的答案。
Sample Input
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0
Sample Output
271451044
969056313
HINT
Source
clj dalao出的神题%%%
一道很好的思维题吧。首先可以发现,满足条件的中位数是具有二分性(即单调性)的。比如数列中一个数$x$,我们把所有比$x$小的数的位置标记成-1,比$x$大的数的位置标记成1,如果和大于0,表示比它大的数枚举多了,所以把答案往右移,反之往左移。满足二分性,所以二分check时满足区间最大值>=0就表示这个数可以作为答案,更新答案。(<=0也可以用来判断,不过维护的是最小值即可)
可以发现,问题中的$bc$区间一定被包括,所以查询$ab$的右缀连续区间最大值和$cd$的左缀连续区间最大值以及$bc$的整个区间和即可。【注意】所有区间都是左闭右开。
考虑如何维护。给每个值建一棵主席数,预处理出每棵主席数上-1和1的情况,每次就在对应二分的pos的主席树上查询即可。
最后是合并节点的问题,$lmax$是从左儿子的$lmax$或者左儿子的$sum$加右儿子的$lmax$更新过来,$rmax$同理。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; int n, ans, a, b, c, d, q[]; struct QwQ {
int v, id;
} A[];
bool cmp ( QwQ a, QwQ b ) { return a.v < b.v; } struct node {
node *ls, *rs;
int sum, lmax, rmax;
void update ( ) {
sum = ls -> sum + rs -> sum;
lmax = max ( ls -> lmax, ls -> sum + rs -> lmax );
rmax = max ( rs -> rmax, rs -> sum + ls -> rmax );
}
} *zero, *root[], pool[*], *tail = pool; node *newnode ( ) {
node *nd = ++ tail;
nd -> ls = zero; nd -> rs = zero;
nd -> sum = ; nd -> lmax = ; nd -> rmax = ;
return nd;
} node *build ( int l, int r ) {
node *nd = newnode ( );
if ( l == r ) {
nd -> sum = nd -> lmax = nd -> rmax = ;
return nd;
}
int mid = ( l + r ) >> ;
nd -> ls = build ( l, mid );
nd -> rs = build ( mid + , r );
nd -> update ( );
return nd;
} void init ( ) {
zero = ++ tail;
zero -> ls = zero; zero -> rs = zero; zero -> sum = ;
zero -> lmax = ; zero -> rmax = ;
root[] = build ( , n );
} node *insert ( node *nd, int l, int r, int pos ) {
node *nnd = newnode ( );
if ( l == r ) { nnd -> sum = -; nnd -> lmax = nnd -> rmax = -; return nnd; }
int mid = ( l + r ) >> ;
if ( mid >= pos ) {
nnd -> rs = nd -> rs;
nnd -> ls = insert ( nd -> ls, l, mid, pos );
} else {
nnd -> ls = nd -> ls;
nnd -> rs = insert ( nd -> rs, mid + , r, pos );
}
nnd -> update ( );
return nnd;
} int query_s ( node *nd, int l, int r, int L, int R ) {
if ( L > R ) return ;
if ( l >= L && r <= R ) return nd -> sum;
int mid = ( l + r ) >> , ans = ;
if ( L <= mid ) ans += query_s ( nd -> ls, l, mid, L, R );
if ( R > mid ) ans += query_s ( nd -> rs, mid + , r, L, R );
return ans;
} int query_l ( node *nd, int l, int r, int L, int R ) {
if ( L > R ) return ;
if ( l >= L && r <= R ) return nd -> lmax;
int mid = ( l + r ) >> , ans = ;
if ( L <= mid ) ans = max ( ans, query_l ( nd -> ls, l, mid, L, R ) );
if ( R > mid ) {
int lsum = query_s ( nd -> ls, l, mid, L, mid );
int rmaxl = query_l ( nd -> rs, mid + , r, L, R );
ans = max ( ans, lsum + rmaxl );
}
return ans;
} int query_r ( node *nd, int l, int r, int L, int R ) {
if ( L > R ) return ;
if ( l >= L && r <= R ) return nd -> rmax;
int mid = ( l + r ) >> , ans = ;
if ( R > mid ) ans = max ( ans, query_r ( nd -> rs, mid + , r, L, R ) );
if ( L <= mid ) {
int rsum = query_s ( nd -> rs, mid + , r, mid + , R );
int lmaxr = query_r ( nd -> ls, l, mid, L, R );
ans = max ( ans, rsum + lmaxr );
}
return ans;
} bool check ( int pos ) {
int ab = query_r ( root[pos], , n, a, b - );
int cd = query_l ( root[pos], , n, c + , d );
int bc = query_s ( root[pos], , n, b, c );
if ( ab + cd + bc >= ) return ;
return ;
} int find ( ) {
int l = , r = n, ans = ;
while ( l <= r ) {
int mid = ( l + r ) >> ;
if ( check ( mid ) ) {
ans = mid; l = mid + ;
} else r = mid - ;
}
return ans;
} int main ( ) {
scanf ( "%d", &n );
init ( );
for ( int i = ; i <= n; i ++ ) {
scanf ( "%d", &A[i].v ); A[i].id = i;
}
sort ( A + , A + + n, cmp );
for ( int i = ; i <= n; i ++ )
root[i] = insert ( root[i-], , n, A[i-].id );
int Q;
scanf ( "%d", &Q );
while ( Q -- ) {
for ( int i = ; i <= ; i ++ ) {
int x; scanf ( "%d", &x );
q[i] = ( x + ans ) % n + ;
}
sort ( q + , q + );
a = q[], b = q[], c = q[], d = q[];
ans = A[find ( )].v;
printf ( "%d\n", ans );
}
return ;
}
【BZOJ】2653: middle的更多相关文章
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
- 【BZOJ】【2434】【NOI2011】阿狸的打字机
AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
随机推荐
- 2017ACM暑期多校联合训练 - Team 7 1008 HDU 6127 Hard challenge (极角排序)
题目链接 Problem Description There are n points on the plane, and the ith points has a value vali, and i ...
- 生成验证码tp
js里拼接随机数 页面上链接 去掉后缀名
- win32的回调函数
[转]http://blog.csdn.net/w419675647/article/details/6599070 众所周知,win32的回调函数WndProc()是操作系统调用的函数,win32用 ...
- awk正则匹配nginx日志【原创】
查看网页访问代码不为200和30x所有行的内容 awk '{if($9!~/200|30*/) print $0}' /app/logs/http_access.log 或 awk '$9!~/200 ...
- C#技术分享【PDF转换成图片——11种方案】
1.[iTextSharp.dll],C# 开源PDF处理工具,可以任意操作PDF,并可以提取PDF中的文字和图片,但不能直接将PDF转换成图片. DLL和源码 下载地址:http://downloa ...
- jplayer.js 与 video.js
HTML5 - 两款基于JS的视频播放器 都是基于h5 video 标签,如果不支持则会自动转成flash,这里个人比较推荐使用jplayer; 1.video.js pc端有时候会与视频打交道,如果 ...
- 教你如何修改FireFox打开新标签页(NewTab Page)的行列数
FireFox的打开新建标签页(即NewTab Page)默认只能显示3x3个网站缩略图,这9个自定义的网站,非常方便快捷,什么hao123的弱爆了,本人从未用过此类导航网站,曾经用过的也只是abou ...
- javascript初步了解
0.1 <script> 和 </script> 会告诉 JavaScript 在何处开始和结束. <script> 和 </script> 之间的 ...
- python基础(9)--递归、二叉算法、多维数组、正则表达式
1.递归 在函数内部,可以调其他函数,如果一个函数在内部调用它本身,这个函数就是递归函数.递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于裂解 递归算法解决问题的特点: 1)递归是 ...
- unittest单元测试
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...