这个二分哪里有错呢
查看原帖
这个二分哪里有错呢
227139
TAICAILA楼主2021/10/22 22:09
#include <bits/stdc++.h>
using namespace std;
long long  m, L, R, k, t, p, tmp, n, a[300009];
long long ef1()
{
	long long l=L, r=R, mid, ans=L-1;
	while(l <= r)// 小于等于k的最大值 
	{
		mid = (l+r)/2;
		if(a[mid]+tmp <= k)
		{
			ans = mid;
			l = mid+1; 
		}
		else
			r = mid-1;	
	}
	return ans;
}
long long ef2()
{
	long long l=L, r=R, mid, ans=R+1;
	while(l <= r) //大于等于-k的最小值 
	{
		mid = (l+r)/2;
		if(a[mid]+tmp >= -k)
		{
			ans = mid;
			r = mid-1;
		}
		else
			l = mid+1; 
	}
	return ans;
}
int main()
{
	scanf("%lld%lld%lld", &n, &m, &k);
	
	for(long long i=1; i<=n; i++)
		scanf("%lld", &a[i]);
		
	sort(a+1, a+n+1);
	
	L = 1, R = n, tmp = 0;//偏移量 
	
	while(m--)
	{
		scanf("%lld", &t);
		if(t == 3)
		{
			long long t1 = ef1();// 右端点值 
			long long t2 = ef2();// 左端点值 
			//cout << t2 << " " << t1 << " **" ;
			printf("%lld\n", t1-t2+1); //cout << t1-t2+1 << endl;
			L = t2; R = t1;
		}
		else
		{
			scanf("%lld", &p);//cin >> p;
			if(t == 1)
				tmp += p;
			else
				tmp -= p;	
		}
	}	
	return 0;
}
2021/10/22 22:09
加载中...