求助,本地可通过的样例提交后RE
  • 板块P1801 黑匣子
  • 楼主dottlespectre
  • 当前回复11
  • 已保存回复11
  • 发布时间2020/5/6 14:36
  • 上次更新2023/11/7 03:02:27
查看原帖
求助,本地可通过的样例提交后RE
79067
dottlespectre楼主2020/5/6 14:36

使用的权值线段树,在本地并没有发生运行错误,且答案正常。开的数组已经远大于需要的空间了。

我猜测可能是函数的问题,希望有dalao帮忙看一下。

#include<bits/stdc++.h>
#define N 3000000
#define mid (l+r>>1)
#define lson k<<1
#define rson k<<1|1
using namespace std;

int s[N],a[N],x,b[N],n,m,sz,tp,nw;

void add(int k,int l,int r,int p){//p位置增加1
	s[k]++;
	if(l==r)return;
	else if(p<=mid)add(lson,l,mid,p);
	else add(rson,mid+1,r,p);
}

int fd(int k,int l,int r,int p){//找第k小的数
	if(l==r)return b[l];
	else if(p<=s[lson])fd(lson,l,mid,p);
	else fd(rson,mid+1,r,p-s[lson]); 
}

signed main(){
//	freopen("P1801_1.in","r",stdin);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+1+n),sz=unique(b+1,b+1+n)-(b+1);//离散化
	for(int i=1;i<=n;i++)//将a变为在b中的对应位置
		a[i]=lower_bound(b+1,b+1+sz,a[i])-b;
	for(int i=1;i<=m;i++){
		scanf("%d",&x);
		while(tp<x)
			add(1,1,sz,a[++tp]);
		fd(1,1,sz,i);
	}
	return 0;
}
2020/5/6 14:36
加载中...