样例过了但爆零求助,玄关
  • 板块P1168 中位数
  • 楼主ni_ju_ge
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/7 21:38
  • 上次更新2024/11/7 21:45:24
查看原帖
样例过了但爆零求助,玄关
934048
ni_ju_ge楼主2024/11/7 21:38
#include<bits/stdc++.h>
using namespace std;
int n,a[100001],b[100001];
struct node {
	int l,r,sum;
} tree[400001];
struct ckid {
	int sit,dat;
} v[100001];
bool cmp(ckid x,ckid y) {
	return x.dat<y.dat;
}
void build(int left,int right,int pos) {
	tree[pos].l=left;
	tree[pos].r=right;
	if(left==right)return;
	int mid=(left+right)/2;
	build(left,mid,pos*2);
	build(mid+1,right,pos*2+1);
}
void tplus(int pos,int goal,int cnt) {
	if(tree[pos].l==tree[pos].r) {
		if(tree[pos].l==goal)tree[pos].sum+=cnt;
		return;
	}
	int mid=(tree[pos].l+tree[pos].r)/2;
	if(goal<=mid) tplus(pos*2,goal,cnt);
	if(goal>mid) tplus(pos*2+1,goal,cnt);
	tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
}
int middle(int pos,int cnt,int sum) {
	if(tree[pos].l==tree[pos].r)return tree[pos].l;
	cnt+=tree[pos*2].sum;
	if(cnt>=(sum+1)/2)return middle(pos*2,0,sum);
	else return middle(pos*2+1,cnt,sum);
}
void dick() {
	sort(v+1,v+n+1,cmp);
	for(int i=1; i<=n; i++) {
		a[v[i].sit]=i;
		b[i]=v[i].dat;
	}
}
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>v[i].dat;
		v[i].sit=i;
	}
	dick();
	build(1,n,1);
	cout<<b[a[1]]<<endl;
	tplus(1,a[1],1);
	for(int i=2; i<=n; i++) {
		tplus(1,a[i],1);
		if(i%2==1)cout<<b[middle(1,0,i)]<<endl;
	}
}

用权值线段树做的。。。(萌新刚学,轻喷)

2024/11/7 21:38
加载中...