bzoj 2653 洛谷 P2839 [国家集训队] middle

2653: middle

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2381  Solved: 1340
[Submit][Status][Discuss]

Description

一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。给你一个
长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。
其中a<b<c<d。位置也从0开始标号。我会使用一些方式强制你在线。

 

Input

第一行序列长度n。接下来n行按顺序给出a中的数。
接下来一行Q。然后Q行每行a,b,c,d,我们令上个询问的答案是
x(如果这是第一个询问则x=0)。
令数组q={(a+x)%n,(b+x)%n,(c+x)%n,(d+x)%n}。
将q从小到大排序之后,令真正的
要询问的a=q[0],b=q[1],c=q[2],d=q[3]。  
输入保证满足条件。
第一行所谓“排过序”指的是从小到大排序!
n<=20000,Q<=25000
 

 

Output

Q行依次给出询问的答案。

 

Sample Input

5
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0

Sample Output

271451044
271451044
969056313
emmm这道题就是一道二分答案主席树 二分我的中位数是什么 然后check判断他是否满足条件
那么怎么判断呢 对于一段区间 我们假设现在我们要check的中位数是x  对应这个区间我们建立一棵线段树
若一个数 ≥ x 那么这个数在对应线段树里面的值设为1 否则设为 - 1 
那么对应这一段的区间和如果等于0 那么这个数就可以作为这段区间的中位数
如果 > 0 则表示这段区间内比他大的数偏多 也就是说我们现在枚举的这个数相对于中位数偏小 反之偏大
那么很显然这个东西是满足二分的 
但是又出现了一个问题 就是我们怎么搞每一个数对应的区间的值吧 肯定不可能是对于每一个数都开一棵线段树
但是肯定不可能 时间空间都不够用  这时候就想到了主席树 
然而这个主席树是怎么建立的呢 我们先对应所有的值都排一边序(要存储他们的原位置)
那么对于i + 1这个位置上的数对应的主席树 他相对于 i 这个位置上的数对应的主席树
发生的变化是不是就是将原数组中 i 对应的位置上的值从 1 改成 - 1 所以就很容易维护了
那么怎么对于[a,b] [c,d]查询呢 按照题意 [b,c]是必须选的 求区间和即可那么要使中位数最大 就要使我们所求的区间和尽可能大
也就是求从b起向左的最大区间和 和从c起向右的最大区间和 求个和 根据上述判断方式二分
然后就这样 我wa了好几次 竟然是查询右儿子的时候写的是 l 到 mid 丢脸...
代码
#include <bits/stdc++.h>
using namespace std;const int N = 20000 + 10;
int a,b,c,d,T,n,w[N],sum[32 * N],ls[32 * N],rs[32 * N];
int rmax[32 * N],lmax[32 * N],rt,root[N],q[10],ans = 0;struct node{int val,pos;
}s[N];void update(int nd) {sum[nd] = sum[ls[nd]] + sum[rs[nd]];rmax[nd] = max(rmax[rs[nd]],sum[rs[nd]] + rmax[ls[nd]]);lmax[nd] = max(lmax[ls[nd]],sum[ls[nd]] + lmax[rs[nd]]);
}int build(int l,int r) {int nd = ++ rt;if(l == r) {sum[nd] = lmax[nd] = rmax[nd] = 1;return nd;}int mid = (l + r) >> 1;ls[nd] = build(l,mid);rs[nd] = build(mid + 1,r);update(nd);return nd;
}int modify(int pre,int l,int r,int pos) {int nd = ++ rt;sum[nd] = sum[pre]; ls[nd] = ls[pre],rs[nd] = rs[pre];if(l == r) {sum[nd] = -1;rmax[nd] = 0;lmax[nd] = 0;return nd;}int mid = (l + r) >> 1;if(pos <= mid) ls[nd] = modify(ls[pre],l,mid,pos);else rs[nd] = modify(rs[pre],mid + 1,r,pos);update(nd);return nd;
}bool cmp(const node & a,const node & b) {return a.val < b.val;
}int query(int nd,int l,int r,int L,int R) {if(l > R || r < L) return 0;if(l >= L && r <= R) return sum[nd];int mid = (l + r) >> 1,ans = 0;if(L <= mid) ans += query(ls[nd],l,mid,L,R);if(mid < R)  ans += query(rs[nd],mid + 1,r,L,R);return ans;
}int query_r(int nd,int l,int r,int L,int R) {if(l > R || r < L) return 0;if(l >= L && r <= R) return rmax[nd];int mid = (l + r) >> 1,ans = 0;if(mid < R) ans = query_r(rs[nd],mid + 1,r,L,R);if(L <= mid) {int l_rmax = query_r(ls[nd],l,mid,L,R);int r_sum = query(ls[nd],mid + 1,r,L,R);ans = max(ans,l_rmax + r_sum);}return ans;
}int query_l(int nd,int l,int r,int L,int R) {if(L > R) return 0; if(l >= L && r <= R) return lmax[nd];int mid = (l + r) >> 1,ans = 0;if(L <= mid) ans = query_l(ls[nd],l,mid,L,R);if(mid < R) {int r_lmax = query_l(ls[nd],mid + 1,r,L,R);int l_sum = query(ls[nd],l,mid,L,R);ans = max(ans,r_lmax + l_sum);}return ans;
}bool check(int mid) {int ab = query_r(root[mid],1,n,q[1],q[2] - 1);int bc = query(root[mid],1,n,q[2],q[3]);int cd = query_l(root[mid],1,n,q[3] + 1,q[4]);if(ab + bc + cd >= 0) return true;return false;
}int find( ) {int l = 1,r = n,ans = 0;while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) ans = mid,l = mid + 1;else r = mid - 1;}return ans;
}int main( ) {scanf("%d",& n);for(int i = 1;i <= n;i ++) {scanf("%d",& w[i]);s[i].pos = i; s[i].val = w[i];}sort(s + 1,s + n + 1,cmp);scanf("%d",& T);root[1] = build(1,n);for(int i = 2;i <= n;i ++) {root[i] = modify(root[i - 1],1,n,s[i - 1].pos);}while(T --) {scanf("%d%d%d%d",& a,& b,& c,& d);q[1] = (a + ans) % n + 1; q[2] = (b + ans) % n + 1;q[3] = (c + ans) % n + 1; q[4] = (d + ans) % n + 1;sort(q + 1,q + 5);ans = s[find( )].val;printf("%d\n",ans);}
}

 

转载于:https://www.cnblogs.com/Rubenisveryhandsome/p/9508058.html

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

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

相关文章

linux统计单拷贝基因家族,为什么要进行基因家族分析?

原标题&#xff1a;为什么要进行基因家族分析&#xff1f;某物种基因组被测序后&#xff0c;大部分课题组都会发表一些基因家族分析的文章&#xff0c;此举常常被误解为“灌水”&#xff0c;其实不然&#xff0c;理清基因组内基因家族成员分类组成&#xff0c;是挖掘和物种特性…

童继龙:论ERP顾问的创新分享与专业精神

童继龙&#xff1a;论ERP顾问的创新分享与专业精神出处:51CTO博客 文: 童继龙 评论( 0 )条 论坛 博客导读&#xff1a;公司的核心价值观中有一部分为“持续创新”&#xff0c;对实施同事的行为态度考核中有两项为“创新分享”和“专业精神”&#xff0c;因为上海实施部的新同事…

图解分析 Linux 网络包发送过程

大家好&#xff0c;下面的文章转发一个鹅厂同学的文章&#xff0c;这篇文章从应用到内核&#xff0c;写的非常不错&#xff0c;希望大家分析某个技术也可以从这方面入手。-----大家好&#xff0c;我是飞哥!半年前我以源码的方式描述了网络包的接收过程。之后不断有粉丝提醒我还…

linux下shell编程课程设计,Linux下shell编程实例

1. 推断一文件是不是块或字符设备文件。假设是将其复制到 /dev 文件夹下read -p "input a file:" filenameif [ -b $filename -o -c $filename ]thencp $filename /dev/fi2.编写一个脚本。进行简单的减法运算。要求提示输入变量#!/bin/bashread -p "input a num…

[Pku 2774] 字符串(六) {后缀数组的构造}

{ 从这一篇开始介绍后缀数组 一个强大的字符串处理工具 可以先研读罗穗骞的论文 后缀数组——处理字符串的有力工具 再行阅读本文 本文仅作参考和补充 } 字符串的后缀很好理解 譬如对于字符串"aabaaaab" 后缀有{"b","ab","aab","…

使用ReflectionToStringBuilder实现toString方法

org.apache.commons.lang.builder.ReflectionToStringBuilder是commons-lang里的一个类。 import org.apache.commons.lang3.builder.ReflectionToStringBuilder; Overridepublic String toString() {return ReflectionToStringBuilder.toString(this); } 如果需要排除某些字段…

linux下I2C驱动发送IO时序,笔记四:linux下IO口模拟实现I2C协议

一、i2c总线是什么&#xff1f;1、i2c总线是一种物理总线及实实在在的总线&#xff0c;通过板子pcb等图能看到。2、i2c总线是一种主从结构。3、i2c总线是一种通信协议。4、i2c总线是两线制半双工串行总线&#xff1a;两线制&#xff1a;数据线(SDA)——>数据传输、时钟线(SC…

rails3异步发邮件

actionmailer 3.0 结合ar_mailer_rails3 异步发送邮件3 次投票jerry 分享于 3 个月 前, 0 条回复, 244 次浏览Share|actionmailer 3.0 的用法有所改进&#xff0c;并结合ar_mailer_rails3做异步邮件的发送&#xff0c;是比较方便的一种选择&#xff0c;把邮件都交给后台任务来发…

我见过的极品代码bug

程序员写代码有bug是很难避免的&#xff0c;也是因为程序员的bug存在&#xff0c;才让另一个职业有了更好的发展&#xff0c;那就是软件测试行业。但是程序员写bug&#xff0c;对于自己肯定是一件非常难忘的事情。我记得我在之前做一个TP固件升级的功能&#xff0c;也就是开机的…

Linux监控服务并主动重启

Linux查询后台进程&#xff0c;如果没有进程号&#xff0c;则重启服务&#xff1a; #!/bin/sh basepath$(cd dirname $0; pwd) while true doprocnumps -ef|grep "服务名称"|grep -v grep|wc -lif [ $procnum -eq 0 ]then#启动命令echo date %Y-%m-%d date %H:%M:%S …

c语言数组传递技术作用特点,C语言笔试题总结3

4. static有什么用途&#xff1f;(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别&#xff1f;1) 引用必须被初始化&#xff0c;指针不必。2) 引用初始化以后不能被改变&#xff0c;指针可以改变所指的对象。2) 不存在指向空值的引用&…

双一流大学毕业的我,应该何去何从?

内卷时代&#xff0c;万物皆可卷&#xff01;什么是内卷&#xff0c;比如&#xff0c;你在电影院看电影&#xff0c;有一个人站起来了&#xff0c;那么就会有第二个人站起来&#xff0c;没一会儿所有的人就站起来了&#xff0c;但是和坐着相比&#xff0c;站着看电影体验感很差…

[Error]SyntaxError: unindent does not match any outer indentation level

刚开始学习Python 解析器用的IDLE&#xff0c;Python3.1&#xff0c;照着某个入门教程敲代码&#xff0c;敲到if的时候&#xff0c;总是出现这个错误 >>> if x<0:x0elif x0:SyntaxError: unindent does not match any outer indentation level 因为x0这行回车后&am…

go

我放弃Python转Go语言的9大理由&#xff08;附优秀书籍推荐&#xff09; https://www.jb51.net/article/126998.htm 转载于:https://www.cnblogs.com/charlieLeo/p/9512713.html

【原创】从 列表的重复 到 用sum展开二层嵌套列表将子元素合并

转载请注明出处&#xff1a;https://www.cnblogs.com/oceanicstar/p/9517159.html★像R语言里头有rep函数可以让向量的值重复&#xff0c;在python里面可以直接对列表用乘法让列表进行重复注&#xff1a;这里生成的重复列表是个新列表&#xff08;我们可以打印id查看一下&#…

c语言找出最大值和最小值并按降序排输出,大学一年级下学期C语言程序设计实验报告答案 完整版...

for(j7;j>i;j--)//将插入点以后的元素顺序往后移一位 a[j1]a[j];a[i]number;//插入数据 printf(\输出改变后的数组\\n\for(i0;i<8;i)//输出插入后仍有序的数组 printf(\ }(3)写一个3 x 5矩阵的转置程序&#xff0c;输出其原矩阵的值和转置以后的结果。提示&#xff1a;1)…

如何正确的使用微信公众号

我发现很多人可能不知道怎么在微信公众号里面查找自己想要的内容。所以制作了两个视频第一个是如何搜索文章&#xff0c;通过关键字搜索可以找到很多自己想要的内容还有通过微信公众号查找资料&#xff0c;这个是我最近刚增加的功能。~就这两件事~喜欢C/C语言或者正在学习C/C语…

shell替换程序里的代码

需求&#xff1a; 扩展名类型: .php .html .shtml .inc 将http://market.pk.com/files/union/ad_union_5.js替换为http://market.pk.com/files/union/union_5.jshttp://market.pk.com/files/advertisement/27/ad_27.js替换http://market.pk.com/files/upload/27/27.js http://m…

接上电就工作的单片机

对于手边的一盒STC单片机&#xff0c;测试一下它们使用相同的ISP方案在下载过程中是否都可以按照相同的方式完成程序的下载。同时对它们建立各自的元器件库&#xff0c;以便于后期的应用。通过这个实验&#xff0c;看到STC的单片机使用起来真实简捷明了&#xff0c;接上电就工作…

c语言编辑的库存管理软件,C语言课程设计,商品库存管理系统怎么做啊?

我教你。。#include#include#include#includeint count0;struct commodity{int id; /*商品编号*/int number; /*库存数量*/int price; /*单价*/char name[20]; /*商品名称*/char indate[9]; /*入库时间*/char deadline[9]; /*有效日期*/}a[100];void page_title(char *menu_ite…