ARC B the median of the median

题目

题目的意思是对于序列a1,a2,……,an,求其中所有子串的中位数组成的序列的中位数。

1.在比赛的时候想到了二分答案,但是对于如何进行验证完全没有头绪

2.二分答案,对于每个枚举的答案数,求中位数比他小的字串的个数和以其为中位数的字串的个数,就可以通过和n*(n-1)/2+1比较判断该数是不是答案

3.实现:将所有>所验证数的答案全都赋值成1,所有<=验证数的答案全都赋值成-1,求前缀和,可见一对i、j满足sum[i]-sum[j]<0即代表一个中位数比验证数小的字串,故问题转换成求逆序对的问题,用线段树可解,效率大概为O(nlog^2(n))

#include<iostream>
#include<stdio.h> 
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<map>
#include<stack>
#define go(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define ll long long
#define N 100005
using namespace std;

ll a[N],a1[N],b[N],n,sum,t[N*8];
void insert(int k, int l, int r, int pos){
	if (l>pos||r<pos) return;
	if (l==r&&r==pos){
		t[k]++;
		return;
	}
	ll m=(l+r)/2;
	insert(k*2,l,m,pos);insert(k*2+1,m+1,r,pos);
	t[k]=t[k*2]+t[k*2+1];
};
ll query(int k, int l, int r, int left, int right){
	if (l>right||r<left){
		return 0;
	}
	if (left<=l&&r<=right){
		return t[k];
	}
	ll m=(l+r)/2;
	return query(k*2,l,m,left,right)+query(k*2+1,m+1,r,left,right);
}

bool check(ll mdi){
	ll maxn=N;
	b[0]=N;
	go(i,1,n){
		if (a[i]>mdi) b[i]=b[i-1]+1;
		else b[i]=b[i-1]-1;
		maxn=max(maxn,b[i]);
	}
	memset(t,0,sizeof(t));
	ll tot=0;
	insert(1,1,maxn,N);
	go(i,1,n){
		tot+=(b[i]==maxn?0:query(1,1,maxn,b[i]+1,maxn));
		insert(1,1,maxn,b[i]);
	}
	return (tot>=n*(n+1)/2/2+1);
}

/*
用这个可以直接求的是中位数肯定比这个数小的1 2 3 4  


*/

ll doit(){
	ll l=1,r=sum;

	while (l!=r){
		ll m=(l+r)/2;
		if (check(a1[m])){
			r=m;
		}
		else {
			l=m+1;
		}
	}
	
	return a1[l];
}
int main(){
		scanf("%d",&n);
		go(i,1,n){
			scanf("%d",&a[i]);
			a1[i]=a[i];
		}
		sort(a1+1,a1+1+n);
		sum=0;
		go(i,1,n){
			if (i==1||a1[i-1]!=a1[i])sum++;
			a1[sum]=a1[i];
		}
		ll ans=doit();
		printf("%lld\n",ans);
}

线段树

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值