样例过不去,不知道怎么了,求调qwq
  • 板块P1168 中位数
  • 楼主Miss_you
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/7 10:59
  • 上次更新2023/10/27 16:39:07
查看原帖
样例过不去,不知道怎么了,求调qwq
759380
Miss_you楼主2022/8/7 10:59
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#define ll long long
#define midd() int mid=(l+r)>>1
using namespace std;
const int N(1e5+1);
struct Node{
	int ls,rs,val;
}tre[N<<2];
vector<int> v;
int a[N],cnt,rt,n;
bool vis[N];
inline int  getid(int x){
	return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
void ins(int l,int r,int &nw,int val)
{
	if(!vis[val])vis[val]=true,nw=++cnt;
	tre[nw].val++;
	if(l==r)return ;
	midd();
	if(val<=mid)return ins(l,mid,tre[nw].ls,val);
	return ins(mid+1,r,tre[nw].rs,val);
}
int query(int l,int r,int nw,int p)
{
	if(l==r)return l;
	midd();
	if(p<=tre[tre[nw].ls].val)return query(l,mid,tre[nw].ls,p);
	return query(mid+1,r,tre[nw].rs,p-tre[tre[nw].ls].val);
}
int main()
{
	register int i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",a+i),v.push_back(a[i]);
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()),v.end());
	printf("%d\n",a[1]);
	ins(1,n,rt,getid(a[1]));
	for(i=1;i*2<n;i++)
		ins(1,n,rt,getid(a[i*2])),ins(1,n,rt,getid(a[i*2+1])),printf("%d\n",query(1,n,rt,i+1));
	return 0;
}

个人第一次打权值线段树。。。算是乱打的吧

2022/8/7 10:59
加载中...