bzoj2653: middle

bzoj 2653: middle(陈立杰) 首先膜拜clj。。。 这道题初看没头绪,看了诸多题解后,发现时先二分,在把大于等于它的为1,小于它的为-1,一段区间最大连续和非负就行 然后想了N久都没想通,终于,在昨天在外拜年时想通了,就是以每个数建可持久化线段树,然后维护sum,lsum,rsum这样初始化就nlogn,每次询问log2n,总复杂度O(Qlog2n+nlongn);代码写得还是蛮短的,就是怎么搞都只是rank 6。。。 阅读详情

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2653

思路:陈老师的题

可持久化线段树的又一种应用

对于每次询问,二分答案

我们怎么知道它是大于中位数还是小于中位数呢?

我们把每个小于它的赋成-1,大于等于赋为1

查询左端点在[a,b]右端点在[c,d]的区间的最大子段和

若小于0,则偏大,大于等于0,偏小或者正好

我们建立n棵权值线段树,从小到大把该数对应位置从1变为-1,维护左起/右起最大字段和,区间sum

但空间开不下,改成可持久化版即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=20010,maxt=400010,inf=0x7f7f7f7f;
using namespace std;
int n,Q,lastans=0,q[4],root[maxn];char ch;
void read(int &x){
	for (ch=getchar();!isdigit(ch);ch=getchar());
	for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
}

struct data{
	int v,id;
	void init(int i){read(v),id=i;}
}seq[maxn];
bool cmp(data a,data b){return a.v<b.v;}
struct node{
	int lmax,rmax,sum;
	void assign(int v){lmax=rmax=sum=v;}
};

node merge(const node &a,const node &b){
	node res;
	res.lmax=max(a.lmax,a.sum+b.lmax);
	res.rmax=max(b.rmax,b.sum+a.rmax);
	res.sum=a.sum+b.sum;
	return res;
}

struct Tsegment{
	#define ls ch[p][0]
	#define rs ch[p][1]
	#define mid ((l+r)>>1)
	node t[maxt];int tot,ch[maxt][2];
	inline void update(int p){t[p]=merge(t[ls],t[rs]);}
	void build(int &p,int l,int r){
		p=++tot;
		//printf("p=%d l=%d r=%d\n",p,l,r);
		if (l==r){t[p].assign(1);return;}
		build(ls,l,mid),build(rs,mid+1,r),update(p);
		//printf("p=%d ls=%d rs=%d\n",p,ls,rs);
	}
	void modify(int pre,int &p,int l,int r,int x){
		p=++tot;//printf("%d %d %d %d %d\n",pre,p,l,r,x);
		if (l==r){t[p].assign(-1);return;}
		if (x<=mid) rs=ch[pre][1],modify(ch[pre][0],ls,l,mid,x);
		else ls=ch[pre][0],modify(ch[pre][1],rs,mid+1,r,x);
		update(p);
	}
	
	node query(int p,int l,int r,int a,int b){
		if (l==a&&r==b) return t[p];
		if (b<=mid) return query(ls,l,mid,a,b);
		else if (a>mid) return query(rs,mid+1,r,a,b);
		else return merge(query(ls,l,mid,a,mid),query(rs,mid+1,r,mid+1,b));
	}
	node query(int ver,int l,int r){if (l>r) return (node){-inf,-inf,0};return query(root[ver],1,n,l,r);}
	void modify(int ver,int pos){modify(root[ver-1],root[ver],1,n,pos);}
	#undef mid
}T;

bool check(int id){
	return T.query(id,q[0],q[1]).rmax+T.query(id,q[1]+1,q[2]-1).sum+T.query(id,q[2],q[3]).lmax>=0;
}

void init(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++) seq[i].init(i);
	sort(seq+1,seq+1+n,cmp);
	T.build(root[1],1,n);
	for (int i=1;i<=n;i++)T.modify(i+1,seq[i].id);// printf("root=%d\n",root[i]),
}

void getans(){
	int l=1,r=n,mid=(l+r)>>1,ans=1;
	while (l<=r){
		if (check(mid)) ans=mid,l=mid+1;
		else r=mid-1;
		mid=(l+r)>>1;
	}
	printf("%d\n",seq[ans].v);
	lastans=seq[ans].v;
}

void work(){
	scanf("%d",&Q);
	for (int i=1;i<=Q;i++){
		for (int j=0;j<4;j++)
			read(q[j]),q[j]=(q[j]+lastans)%n+1;
		sort(q,q+4);getans();
		//for (int j=0;j<4;j++) printf("j=%d %d\n",j,q[j]);
		
	}
}

int main(){
	init(),work();
	return 0;
}


STM32CubeMX的正交编码器encoder 由于最近干活遇到需要获取正交编码的功能,所以返回来研究一下STM32CubeMX的编码器功能,之前也更新过STM32的定时器功能,但是因为之前搞平衡车的正交编码器没有搞清楚原理,就直接用了脉冲输入功能草草了事,现在也算是为之前的年轻买单了,不过看到现有的Encoder说明都比较简单,所以就当是为开发者做贡献了,我研究清楚之后来一篇博客。 阅读详情

相关推荐

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

BZOJ2653: middle

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开始标号。 我会使用一些方式强制你在...

weixin_30642267的博客 162

C#实战:如何从零构建一个轻量级软PLC梯形图编辑器(附完整源码)

本文详细介绍了如何使用C#从零开始构建一个轻量级软PLC梯形图编辑器。内容涵盖项目架构设计、GDI+图形渲染、编辑交互实现以及核心的扫描执行引擎开发,并提供了定时器、计数器等高级功能的实现思路与完整源码,为开发者深入工业自动化领域提供了实战指南。

4k5l6j7h8的博客 257

BZOJ 2653: middle

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 关于这道题嘛,首先二分是很容易想的。我们二分中位数,然后判断是否能够达到。设中位数为Mid,如果我们把大于等于Mid的标记为1,小于Mid的标记为-1,则只要存在一段区间满足左端点在[a,b]且右端点在[c,d]并且和大于等于0的即是可行。我们发现[b,c]是必选的,因此我们只要求

执重剑,横江过雁 465

“快速掌握Vivado FPGA开发流程“——详解Vivado开发流程及实例

快速掌握Vivado FPGA开发流程”——详解Vivado开发流程及实例FPGA技术在现代电子领域中应用越来越广泛,而Vivado作为业界最流行的FPGA设计工具之一,也受到越来越多人的关注和使用。那么如何快速掌握Vivado FPGA开发流程呢?本文将详细介绍Vivado开发流程,并通过实例来加深您的理解。首先,我们需要了解Vivado开发流程的主要步骤:创建工程、设计电路、约束电路、生成比特流。接下来,让我们一步步了解这些步骤。

2301_78484069的博客 731

LPDDR6来了!到底比LPDDR5/5X强在哪?从速度到总线,技术细节一次说清!

LPDDR6不仅仅是速度快点、位宽大点那么简单,它是一次架构级的革新,从引脚、总线、时钟管理到Burst协议全部升级。🎯我们正在迈入一个“AI优先”的时代,内存架构也必须跟上。对于做芯片、做整机、做系统的你,理解LPDDR6的技术变化,提前规划测试方案,是现在就该启动的动作!

weixin_43199439的博客 1284

BZOJ2653:middle

浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2653 首先,我们判断一个序列的中位数是否大于等于\(limit\),我们可以使大于\(limit\)的值为\(1\),小于\(limit\)的值为\(-1\)。如果这个新序列...

aga28832的博客 145

Flutter 自适应布局一套代码适配手机和平板(12)

通过LayoutBuilder组件动态检测屏幕尺寸,根据宽度阈值(600px)选择不同布局方式。在小屏幕上显示单页联系人分组,大屏幕采用侧边栏+详情面板的并排布局。核心实现包括:1)使用LayoutBuilder获取父容器约束条件;2)定义大屏幕和小屏幕的布局断点;3)构建响应式界面组件,其中大屏幕布局采用Row横向排列固定宽度侧边栏和弹性宽度的详情区域。这种方案可确保应用在不同设备上都能提供最佳显示效果。

hello.reader 316

[BZOJ]2653: middle

题解:神.....神题 求中位数->区间第k大->主席树 好了进死胡同了 因为没办法差分区间和区间 我们再考虑 对于中位数...那我们把大于等于这个数的置1 小于这个数置-1 然后查询区间和是否大于等于0来check 根据这个性质 我们考虑二分中位数(因为具有单调性...很明显证明 但是每次二分都去修改序列 复杂度太高接受不了 我们考虑用主席树优化 记录把某个位置置为...

weixin_30770783的博客 96

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 290

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6729

bzoj2653:middle

思路:首先容易想到二分答案,但如何去check呢,对于一段区间[l,r],把所有小于答案的都赋值为-1,大于等于它的都赋值为1,然后求左端点在[a,b],右端点在[c,d]的最大子串和即可(也就是区间[a,b]的最大右子串和加上(b,c)的子串和加上区间[c,d]的最大左子串和)这样既可,用个线段树维护一下,每次暴力重建,单次询问的复杂度是完全可以承受的,但如果多次询问时间复杂度将是n^...

V469584691的博客 145

node运行项目-Network: unavailable-没有ip地址

vscode运行vue项目后发现Network: unavailable 是什么情况呢?可能有一下三种情况:1.多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个2.在中配置host及public3.系统环境变量问题。

JackieDYH的博客 7539

Bzoj2653: middle

题面 传送门 Sol 丽洁姐的题目还是棒棒的 考虑二分答案 Check?Check?Check? 把小于它的设为−1−1-1,大于等于它的设为111 [a,b][a,b][a, b]求一个最大后缀子段和 [c,d][c,d][c, d]求一个最大前缀子段和 [b+1,c−1][b+1,c−1][b+1, c-1]求一个和 加起来如果大于等于000,那么满足要求,这个数还可以...

Cyhlnj 218

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

bzoj 2653: middle

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。...

weixin_30439031的博客 132

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

BZOJ 2653: middle 主席树+二分

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

Oakley 956

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: APIO2015&2014题解
下一篇: uoj#164. 【清华集训2015】V
thy_asdf
博客等级 码龄12年 16粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值