思维之:【Educational Codeforces Round 134 (Rated for Div. 2)-C】【STL二分】

该代码实现了一个程序,处理两个非递减整数序列a[]和b[]。它计算a[]中每个元素在b[]中大于等于它的元素数量,并在特定条件下更新一个关键值key。程序通过迭代和利用有序集合(set)来查找大于等于a[i]的元素,从而找到两者之间的交集。具体来说,当a[]中某个位置i的元素满足条件co1==co2时,key被更新为小于当前key的值。案例展示了不同输入情况下程序的输出。
摘要由CSDN通过智能技术生成

主要就ans2[]要思考:

当前枚举到a[]中的某一个位置 i 时,

1.由于a是非递减的,我们很容易就可以算出>=a[i]的数有多少个  记为co1,

(必须要a[i]之后的,比如 5 7 7 7 ,枚举到 i=3 时,co1应该是 2)

2.然后我们要算出 b[] 中有多少个数  >=a[i],  记为co2

 

 如果co1==co2

那key就要变,变成比上一个小的 

 

规律根据下面几个案例找出:

case1:

a序列: 5 7 7

b序列:5 7 8

case2:

a序列: 10 20 30 40

b序列:  22 33 33 55

case3:

a序列: 5 7 9

b序列:6 9 10

 

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int ans2[N];
int ans1[N];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		cin>>a[i];
		
		set<int> sb;
		for(int i=1;i<=n;i++)
		{
		cin>>b[i];
		sb.insert(b[i]);
    	}
    	
    	for(int i=1;i<=n;i++)
		{
			auto it=sb.lower_bound(a[i]); 
			if(it!=sb.end())
			{
				ans1[i]=*it-a[i];
				cout<<ans1[i]<<" ";
			}
		}
		
	   cout<<endl;
		
		
	    int key=b[n];
	    int co1=1;
	    for(int i=n;i>=1;i--)
	    {
	    	ans2[i]=key-a[i];
	    	auto it=sb.lower_bound(a[i]);
	    	if(it!=sb.begin())
	    	{
	    		it--;
			}
			
			int idx=lower_bound(b+1,b+1+n,a[i])-b;
			int co2=n-idx+1;
			
			if(co1==co2)
			{
				key=*it;
			}
			
			co1++;
			
		}
		
		
		for(int i=1;i<=n;i++)
		cout<<ans2[i]<<" ";
		
		cout<<endl;
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值