[BZOJ2653]middle(主席树+二分)

ESP32-S3 SPI接口实战:从引脚分配到高速通信配置 本文详细解析了ESP32-S3的SPI接口配置与高速通信优化技巧,从引脚分配到软件配置,再到DMA传输和时钟优化,帮助开发者快速掌握SPI通信技术。特别针对ESP32-S3的SPI2接口进行了实战演示,包括硬件连接和常见问题排查,适用于各类嵌入式开发项目。 阅读详情

=== ===

这里放传送门

=== ===

题解

这道题最关键的一点就是想到一个对于备选答案的科学判定方法。
给定一个数字 v ,如何判断这个区间的中位数和这个数字的关系?
如果把这个区间内大于这个数字的位置赋值为1,小于这个数字的位置赋值为-1,那么如果这段区间的和小于0,就说明这个区间的中位数比v要小;如果区间和等于0,就说明中位数恰好是 v ;如果区间和大于0,就说明中位数比v要大。

这说明每次判定一个答案就可以筛掉一部分肯定不合法的答案。那么我们可以二分这个中位数,然后把序列上小于它的数赋值为-1,大于的赋值为1,然后只要能构造出区间和大于等于0的区间就说明答案合法。
我们肯定不能每次二分都重新赋值。但是可以注意到当待判定的答案变大的时候,1的数量单调减小而-1的数量单调增加。并且每个数变成-1以后就不会再变了,一共只会改变n次。那么我们可以用以权值为root数组下标,内层线段树按位置维护的主席树来存储这个序列,每次只需要把恰好从1变成-1的位置修改过来,其余的继承前面的结果就可以了。
查询的话只需要在线段树中维护区间和,靠左的最大和还有靠右的最大和就可以了。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000000
using namespace std;
int n,tmp[20010],p[20010],v[20010],q,root[20010],cnt,size,anti[20010],lastans;
struct segtree{
    int lMax,rMax,sum,l,r;
    segtree(){lMax=rMax=-inf;sum=l=r=0;}
    void count();
}t[2000010];
void segtree::count(){
    sum=t[l].sum+t[r].sum;
    lMax=max(t[l].lMax,t[l].sum+t[r].lMax);
    rMax=max(t[r].rMax,t[r].sum+t[l].rMax);
}
int comp(int x,int y){return tmp[x]<tmp[y];}
void build(int &i,int l,int r){
    i=++size;t[i]=segtree();
    if (l==r){
        t[i].lMax=t[i].rMax=t[i].sum=1;
        return;
    }
    int mid=(l+r)>>1;
    build(t[i].l,l,mid);
    build(t[i].r,mid+1,r);
    t[i].count();
}
void insert(int &i,int j,int l,int r,int x,int fir){
    if (fir==-1||i<fir){i=++size;t[i]=t[j];}
    if (l==r){
        t[i].lMax=t[i].rMax=t[i].sum=-1;
        return;
    }
    int mid=(l+r)>>1;
    if (x<=mid) insert(t[i].l,t[j].l,l,mid,x,fir);
    else insert(t[i].r,t[j].r,mid+1,r,x,fir);
    t[i].count();
}
segtree query(int i,int l,int r,int left,int right){
    if (i==0||left>right) return segtree();
    if (left<=l&&right>=r) return t[i];
    int mid=(l+r)>>1;
    segtree L=segtree(),R=segtree();
    if (left<=mid) L=query(t[i].l,l,mid,left,right);
    if (right>mid) R=query(t[i].r,mid+1,r,left,right);
    if (L.lMax==-inf) return R;
    if (R.lMax==-inf) return L;
    L.lMax=max(L.lMax,L.sum+R.lMax);
    L.rMax=max(R.rMax,R.sum+L.rMax);
    L.sum+=R.sum;
    return L;
}
bool check(int val,int a,int b,int c,int d){
    segtree L,R,S;
    L=query(root[val-1],1,n,a,b);
    R=query(root[val-1],1,n,c,d);
    S=query(root[val-1],1,n,b+1,c-1);
    return (L.rMax+S.sum+R.lMax)>=0;
}
int divide(int l,int r,int a,int b,int c,int d){
    int mid,ans=0;
    while (l<=r){
        mid=(l+r)>>1;
        if (check(tmp[mid],a,b,c,d)==true){
            ans=max(ans,mid);l=mid+1;
        }else r=mid-1;
    }
    return tmp[ans];
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        scanf("%d",&tmp[i]);p[i]=i;
    }
    sort(p+1,p+n+1,comp);
    tmp[0]=-inf;
    for (int i=1;i<=n;i++){
        if (tmp[p[i]]==tmp[p[i-1]])
          v[p[i]]=cnt;
        else v[p[i]]=++cnt;
        anti[cnt]=tmp[p[i]];
    }
    for (int i=1;i<=n;i++) tmp[i]=v[i];
    sort(tmp+1,tmp+n+1);
    memset(root,-1,sizeof(root));
    build(root[0],1,n);
    for (int i=1;i<=n;i++)
      insert(root[tmp[i]],root[tmp[i]-1],1,n,p[i],root[tmp[i]]);
    scanf("%d",&q);
    cnt=unique(tmp+1,tmp+n+1)-tmp-1;
    for (int i=1;i<=q;i++){
        int Q[5];
        scanf("%d%d%d%d",&Q[1],&Q[2],&Q[3],&Q[4]);
        for (int j=1;j<=4;j++) Q[j]=(Q[j]+lastans)%n+1;
        sort(Q+1,Q+5);
        lastans=anti[divide(1,cnt,Q[1],Q[2],Q[3],Q[4])];
        printf("%d\n",lastans);
    }
    return 0;
}
Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 阅读详情

相关推荐

libfacedetection 框架阅读及扩展经验

libfacedetection 框架源码解析与扩展心得1. libfacedetection 框架简介2. 源码解析2.1 facedetectcnn.h2.2 facedetectcnn.cpp2.3 facedetectcnn-model.cpp3. 其他层的扩展--depthwise convolution 前段时间因为工作需要,对libfacedetection框架做了些扩展,在阅读源...

weixin_42616332的博客 1500

Bzoj 2653 middle(二分+主席树)

转载请注明出处,谢谢http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents    by---cxlove  一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。 给你一个长度为n的序列s。 回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。

窝不是爱酱,喵~~~~ 5945

Cadence SIP Layout 简单教程-第一章

以摄像头模组软硬结合板为例,描述layout的整个完整过程,从而掌握基本技能。 第一章 准备工作 第一节 原理图不用说layout前需要绘制原理图,原理图不在本文讨论范围内,所以列为准备工作。 需要特别说明的是,绘制原理的最终目的是导出网络表,网络表中的重要参数footprint是让layout软件选择正确封装的关键,所以这里讲解一下原理图设置footprint的位置。在原理图中双击零件,...

whp1920的博客 1万+

bzoj2653 Middle 二分&主席树

这题厉害啊。。。根本想不到。(据说是clj的题?)     首先要想到二分答案,想到就解出一半了。假设有一个值x,如果x是区间[l,r]的中位数,且l∈[a,b],r∈[c,d],那么答案一定>=x;否则答案一定     那么如何判断x是否是[l,r]的中位数呢?实际上,如果使用二分的话,我们不需要知道x是否一定是[l,r]的中位数,只要知道[l,r]中位数是否>=x即可。我们首先看一下如何判

lych的博客 568

保姆级教程:手把手教你用Python逆向分析极验4.0滑块验证码的w参数生成逻辑

本文提供了一份详细的Python逆向工程教程,手把手教你分析极验4.0滑块验证码的w参数生成逻辑。通过HTTP请求分析、JavaScript逆向和加密算法复现,帮助开发者深入理解验证码防护机制,并实现高效的自动化解决方案。教程涵盖AST反混淆、轨迹生成算法和AES加密等核心技术,适合中高级开发者提升逆向工程能力。

weixin_30172941的博客 304

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版)

本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。

weixin_33728268的博客 512

【bzoj2653】【middle】【主席树+二分答案】

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

sunshinezff的专栏 2240

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 305

BZOJ2653 middle 【主席树】【二分】*

BZOJ2653 middle Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。给你一个长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。 其中a Input 第一行序列长度n。接下来n行按顺序给出a中的数。 接下来一行Q。然后Q行每...

Dream_maker的博客 338

将Apollo高精地图中的车道线叠加在多种导航地图上

本文介绍了将Apollo高精地图车道线叠加到普通导航地图的技术方案。高精地图具备厘米级车道精度和丰富的语义信息,叠加可实现可视化验证、调试分析和数据对比等功能。核心技术包括坐标系统转换(UTM/WGS84/BD09/GCJ02)和数据处理流程,通过Python脚本完成Apollo地图解析、坐标批量转换和多格式输出。文章详细提供了环境准备、工作目录创建和坐标转换脚本等操作步骤,实现了高精地图数据在OpenStreetMap、百度地图和高德地图上的可视化展示。

Hi20240217的博客 1333

[Dify实战] 用 Dify 打造高效的新员工 7 天成长计划-带绑定资源

本文介绍了如何利用Dify平台为新员工制定智能成长计划,解决融入难、节奏乱、成长慢等问题。方案通过输入岗位信息自动生成7天结构化计划,包含每日任务和评估要点,并支持进度跟踪与报告输出。关键点在于设计清晰的Prompt模板,合理分配学习节奏,形成闭环反馈机制。该方案能显著提升新员工培养效率,实现人才培养的数字化升级。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 570

bzoj2653middle 主席树+二分答案

2653: middleTime Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1855  Solved: 1031[Submit][Status][Discuss]Description一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。给你一个长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b...

maxtir的博客 498

uniapp [安卓苹果App端] - 解决支付宝支付报错requestPayment:fail [payment支付宝:62009]未知错误,使用uni.requestPayment支付报错排查方案

uni-app支付宝,uniapp支付宝沙箱支付报错,uni.requestPayment,uniAPP App支付宝支付提示错误requestPayment:fail [payment支付宝:62009]未知错误,UNI-APP支付宝报错"code": -100,uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错,uniapp安卓app使用支付宝的沙箱环境支付时报了这个错,安卓端app支付宝支付,在沙箱测试环境测支付,提示“商家订单参数异常,请重新发起付款,选择

🏆 前端领域优质创作者 9609

BZOJ 2653: middle 主席树+二分

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 对于每一个询问,我们可以用二分答案来判断当前值可不可行。 先不考虑多组询问,可以把每一个大于等于二分值的数字设成1,小于二分值的数字设成-1,然后求出[b+1,c-1]的区间和以及[a,b]的右端最大连续和以及[c,d]的左端最大连续和,这几个操作可以用传递结构体的线段树来判定,

Oakley 956

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BZOJ2653 middle 【主席树+二分】

BZOJ SOL 无法确定中位数 ? 我们可以考虑转化思路。 二分一个中位数,再判断是否合理。 根据本题中中位数的定义,只需要小于 它的 数的个数≤∣len2∣\le |{len \over2}|≤∣2len​∣。 我们可以将大于iii的数赋值成111,小于的赋值成−1-1−1。 若maxLsum[a,b−1]+sum[b,c]+maxRsum[c+1,d]≥0若maxLsum[a,b-1]+s...

Jun 179

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

bzoj 2653 middle 二分答案+主席树

题面 题目传送门 解法 其实这道题严格上说并不是主席树,而是可持久化线段树。 显然答案满足单调性,假设我们当前二分到的是midmidmid,那么对应的中位数即为a[mid]a[mid]a[mid](a[mid]a[mid]a[mid]表示从小到大排完序之后的第midmidmid小,不是这个序列中的数显然可以不用考虑)。然后将小于它的数变成-1,其他数变成1。然后对于[a,b],[c,d][a,b...

mysterynoip的博客 251

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[BZOJ2653]middle(二分答案 + 主席树)

Address 洛谷 P2839 BZOJ 2653 Solution 很不错的题 求某个排名的数的最值是一个经典的二分答案套路 方法为:二分答案 midmidmid 之后,把所有数按照与 midmidmid 的大小关系变成 000 和 111 进行判断 而本题也可以先离散化权值之后二分答案 midmidmid 把所有 ≥mid\ge mid≥mid 的值变成 111 , &amp;lt;m...

女装的你,如此好看! 282

【BZOJ2653】【主席树+二分】middle

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

Gregory99174的博客 172

bzoj 2653 middle 二分答案 主席树判定

判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好 但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为-1,能保证以上结论 #include<cstdio> #include<cstring> #include<iostrea...

aida9573的博客 172

bzoj2653 middle(主席树+二分)

中位数最大化,强制在线

蒲公英殇的博客 1531

BZOJ 2653 middle 二分+主席树

BZOJ 2653 middle 二分+主席树

-Claude 1410

BZOJ 2653: middle 二分 主席树

2653: middleTime Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2169  Solved: 1203[Submit][Status][Discuss]Description一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。给你一个长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b...

BlackJack 601

【BZOJ2653】【二分法】【主席树】middle

题目大意:给出长度为n的一个序列s,回答q个询问:s的左端点在[a,b],右端点在[c,d]的子序列中,最大的中位数,强制在线。 将问题转化为判定性问题,先二分出一个数x,然后将区间内大于等于x的数标记为1,小于x的数标记为-1 求区间和sum,如果sum >= 0说明中位数可以比当前数大,这样可以通过迭代求出最大的中位数。 但是题目中限定了左端点和右端点,不难想到可以通过求最大子序列的方

I'm dreamer 947

[BZOJ2653]middle 主席树+二分答案

中位数的题目一定要想到二分答案然后把所有数变成1或-1什么的。。。 先离散化,这样最多只有n个值,然后对于每个值建主席树,>=的设为1,<的设为-1。按照升序建的话每次最多更改一个值,也就是logN个点。 设询问区间[ a, b] [ c, d]为然后二分答案K,现在要求的就是在主席树的第K个版本中(b,c)的和,[ a, b]的最大右子段和,[ c, d]的最大左子段和,三个东西加起来是否大

DOFYPXY的博客 453

[主席树+二分] BZOJ2653: middle

题意**给定一个数字序列。 多次询问,每次求出左端点为a~b,右端点为c~d的所有子序列的中位数的最大值。 一个序列的中位数: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。**题解**很强的主席树应用。 可以想到二分答案,如何验证呢? 肯定算一下比当前答案mid大的数的个数和小的数的个数差。我们设大于等于mid的数为1,小于mi

Lynstery's blog 838

「BZOJ 2653」middle「主席树」「二分」

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

weixin_30487701的博客 115
上一篇: [BZOJ2813]奇妙的Fibonacci(线性筛)
下一篇: 网络流衍生物——有上下界网络流の板子
FromATP
博客等级 码龄10年 75粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值