求调 CF C
  • 板块学术版
  • 楼主Eason2009
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/28 00:35
  • 上次更新2023/10/27 13:23:07
查看原帖
求调 CF C
286448
Eason2009楼主2022/8/28 00:35

思路是二分。

#include<bits/stdc++.h>
#define int long long
#define maxn 200005
using namespace std;
int t,n,a[maxn],b[maxn],ans[maxn],awa[maxn];//有多少个b序列中的元素>=a_i 
signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		for(int i=1;i<=n;i++)
		{
			cin>>b[i];
		}
		for(int i=1;i<=n;i++)
		{
			int res=lower_bound(b+1,b+n+1,a[i])-b;
			awa[i]=n-res; 
			cout<<b[res]-a[i]<<' ';
		}
		cout<<endl;
		int pos=n;
		for(int i=n;i>=1;i--)
		{
			if(i==n) ans[i]=b[n]-a[i];
			else
			{
				int res=lower_bound(b+1,b+n+1,a[i])-b;
				int l=res,r=n,qwq;
				while(l<=r)
				{
					int mid=l+r>>1;
					if(n-i<=awa[mid]) l=mid+1,qwq=mid;
					else r=mid-1;
				}
				ans[i]=b[qwq]-a[i];
			}
		}
		for(int i=1;i<=n;i++)
		{
			cout<<ans[i]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

2022/8/28 00:35
加载中...