样例全过了,但是就过了几个测试点
查看原帖
样例全过了,但是就过了几个测试点
832977
Submerge69楼主2024/8/18 11:57

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],zheng[N],fu[N];
char sr[N];
int n,t,z=1,f=1,ans;
bool check(int zz,int ff)
{
	if(fu[ff]-zheng[zz]<=(2*t)&&zheng[zz]<=fu[ff])
		return true;
	else
		return false;
}
int main()
{
 	//freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);
    cin>>n>>t;
    for(int i=1;i<=n;i++)
    {
    	cin>>sr[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		if(sr[i]=='0')
		{
			fu[f]=a[i];
			f++;
		}
		else
		{
			zheng[z]=a[i];
			z++;
		}
	}
	f--,z--;
	sort(fu+1,fu+f+1);
	sort(zheng+1,zheng+z+1);
	//for(int i=1;i<=z;i++) cout<<zheng[i]<<" ";
	//cout<<endl;
	//for(int i=1;i<=f;i++) cout<<fu[i]<<" ";
	//cout<<endl;
	for(int i=1;i<=f;i++)
	{
		int ansone=0,anstwo=0;
		int l=1,r=z;
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(check(mid,i))
			{
				l=mid+1;
				ansone=mid;
			}
			else
				r=mid-1;
		}
		l=1,r=z; 
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(check(mid,i))
			{
				r=mid-1;
				anstwo=mid;
			}
			else
				l=mid+1;
		}
		if(anstwo==0) ans+=ansone-anstwo;
		else ans+=ansone-anstwo+1;
		//cout<<anstwo<<" "<<ansone<<endl;
	}
	cout<<ans<<endl;
	return 0;//洛谷大大给我AC吧!
}

2024/8/18 11:57
加载中...