求助读入问题
查看原帖
求助读入问题
426969
Fxx_222楼主2022/11/27 10:49

n=3000的数据没办法读入,a数组和b数组读了一半自动跳出来开始读询问了,蒟蒻真没查出来为什么会读入失败,求助

#include<bits/stdc++.h>

using namespace std;
int cl[800000],cr[800000],wza[800000],wzb[800000],n,lfta[800000],rgta[800000],wa[800000],a[800000],lftb[800000],rgtb[800000],wb[800000],b[800000];
void builda(int p,int l,int r)
{
	lfta[p]=l,rgta[p]=r;
	if(l==r)
	{
		wa[p]=a[l];
		return;
	}
	int mid=(l+r)/2;
	builda(p*2,l,mid);
	builda(p*2+1,mid+1,r);
	wa[p]=max(wa[p*2],wa[p*2+1]);
	return;
}
void buildb(int p,int l,int r)
{
	lftb[p]=l,rgtb[p]=r;
	if(l==r)
	{
		wb[p]=b[l];
		return;
	}
	int mid=(l+r)/2;
	buildb(p*2,l,mid);
	buildb(p*2+1,mid+1,r);
	wb[p]=max(wb[p*2],wb[p*2+1]);
	return;
}
int chaxuna(int p,int l,int r)
{
	if(lfta[p]>=l && rgta[p]<=r) return wa[p];
	int mid=(lfta[p]+rgta[p])/2;
	int rt=0;
	if(l<=mid) rt=max(rt,chaxuna(p*2,l,r));
	if(r>mid) rt=max(rt,chaxuna(p*2+1,l,r));
	return rt; 
}
int chaxunb(int p,int l,int r)
{
	if(lftb[p]>=l && rgtb[p]<=r) return wb[p];
	int mid=(lftb[p]+rgtb[p])/2;
	int rt=0;
	if(l<=mid) rt=max(rt,chaxunb(p*2,l,r));
	if(r>mid) rt=max(rt,chaxunb(p*2+1,l,r));
	return rt; 
}
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0' && c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	//cout<<"K";
	return x*f;
}
int dfs(int l,int r)
{
	if(l>r) return 0;
	if(l==r) return a[l]*b[l];
	int ma=chaxuna(1,l,r);
	int mb=chaxunb(1,l,r);
	if(l+1==r) return a[l]*b[l]+a[r]*b[r]+ma*mb;
	int mxl=min(wza[ma],wzb[mb]);
	int mxr=max(wza[ma],wzb[mb]);
	//cout<<"K "<<mxl<<" "<<mxr<<endl;
	int rt=0;
	rt+=(dfs(l,mxr-1));
	rt+=(dfs(mxl+1,r));
	rt-=(dfs(mxl+1,mxr-1));
	rt+=(r-mxr+1)*(mxl-l+1)*(ma*mb);
	return rt;
}
void sol2(int num)
{
	int l=cl[num],r=cr[num];
	int ans=dfs(l,r);
	cout<<ans<<endl;
	return;
}
int main()
{
	//freopen("match.in","r",stdin);
	//freopen("match.out","w",stdout);
	int T=read();
	n=read();
	//cout<<n<<endl;
	for(int i=1;i<=n;i++) 
	{
		a[i]=read();
		wza[a[i]]=i;
	}
	for(int i=1;i<=n;i++) 
	{
		b[i]=read();
		wzb[b[i]]=i;
	}
	/*cout<<endl<<"KKK";
	for(int i=1;i<=n;i++) cout<<wza[i]<<" ";
	cout<<endl<<"BBB";
	for(int i=1;i<=n;i++) cout<<wzb[i]<<" ";
	cout<<endl;*/
	
	int Q=read();
	for(int i=1;i<=Q;i++) cl[i]=read(),cr[i]=read();
	builda(1,1,n);
	buildb(1,1,n);
	for(int i=1;i<=Q;i++) sol2(i); 
	return 0;
}
2022/11/27 10:49
加载中...