【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 2 1009 HDU 60563 TrickGCD (容斥公式)
题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...
- Tinyos 第三版Make系统
1.make系统安装 cd tools ./Bootstrap ./configure make sudo make install 2.make系统结构 3.第三版Makerules文件部分解析 # ...
- pycharts实现可视化
https://blog.csdn.net/u012535605/article/details/80677791http://pyecharts.org/#/zh-cn/prepare (中文官网 ...
- Linux mint 18.1 / Ubuntu 16.04 安装steam
这里以Limit Mint 18.1为例: 安装steam: sudo dpkg -i steam.deb 运行后会有如下错误: 直接运行如下命令修复, 并自动启动steam: LD_PRELOAD= ...
- git常用命令速查表【转】
- Linux CentOS 6.9(图形界面)安装中文输入法
安装步骤 1. 切换到 root 用户,执行 yum -y install "@Chinese Support" 2. 退出终端,选择桌面菜单中 "System" ...
- 初学Memcached安装及使用【转】
1.yum install memcached安装memecached 2.chkconfig memcached on设置memcached开机启动 3.service memcached star ...
- java基础12 抽象类(及关键字:abstract)
抽象类:abstract 1.应用的场景 我们描述一类事物时,存在着某种行为,但这种行为目前不具体,那么我们就可以抽取这种行为的声明,但是不去实现这种行为,我们就需要使用抽象类. 2.抽象的好处 强制 ...
- golang类型转换小总结
1. int <--> string 1.1. int --> string str := strconv.Itoa(intVal) 当然,整数转换成字符串还有其他方法,比如 fmt ...
- Python+Selenium 自动化实现实例-获取测试对象的Css属性
#coding:utf-8 '''获取测试对象的css属性场景 当你的测试用例纠结细枝末节的时候,你就需要通过判断元素的css属性来验证你的操作是否达到了预期的效果.比如你可以通过判断页面上的标题字号 ...