Why TLE 40 pts【悬 5 关】
查看原帖
Why TLE 40 pts【悬 5 关】
1031934
捧着风的少年楼主2024/10/19 18:37

Problem B

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf LONG_LONG_MAX
const int N = 1e5 + 10;
int n, q, x, mn = inf, mx;
map <int, int> tr;
int lowerbit(int x)
{
	return x & (-x);
}
//tr[i] = the sum of [i - lowerbit(i) + 1, i]
void update(int x, int y)
{
	for(int i = x; i <= 1e9; i += lowerbit(i))
	{
		tr[i] += y;
	}
}
int qianzhui(int x)
{
	int ret = 0;
	for(int i = x; i >= 1; i -= lowerbit(i))
	{
		ret += tr[i];
	}
	return ret;
}
int query(int x, int y)
{
	return qianzhui(y) - qianzhui(x - 1);
}
int pe(int x)
{
	int l = 0, r = x, ans = -2;
	int y = qianzhui(x) - 1;
	//二分最后一个 ans 满足 qianzhui(ans) < y 
	while(l <= r)
	{
		int mid = (l + r) >> 1;
//		printf("mid = %lld\n", mid);
		if(qianzhui(mid) < y)
		{
//			printf("\t1\n");
			ans = mid;
			l = mid + 1;
		}
		else
		{
//			printf("\t2\n");
			r = mid - 1;
		}
	}
	return ans;
}
int nt(int x)
{
	int l = x, r = 1e9, ans = inf;
	int y = qianzhui(x);
	//二分最前一个 ans 满足 qianzhui(ans) > y 
	while(l <= r)
	{
		int mid = (l + r) >> 1;
//		printf("mid = %lld\n", mid);
		if(qianzhui(mid) > y)
		{
//			printf("\t1\n");
			ans = mid;
			r = mid - 1;
		}
		else
		{
//			printf("\t2,qianzhui(mid)=%lld,y=%lld\n", qianzhui(mid), y);
			l = mid + 1;
		}
	}
	return ans;
}
signed main()
{
	freopen("secret.in", "r", stdin);
	freopen("secret.out", "w", stdout);
	cin >> n >> q;
	for(int i = 1; i <= n; i++)
	{
		cin >> x;
		update(x, 1);
		mn = min(mn, x);
		mx = max(mx, x);
	}
	while(q--)
	{
		char op;
		cin >> op;
		if(op == '+')
		{
			cin >> x;
			update(x, 1);
			mn = min(mn, x);
			mx = max(mx, x);
		}
		else if(op == '-')
		{
			cin >> x;
			update(x, -1);
			if(mn == x)
			{
				mn = inf;
			}
			else if(mx == x)
			{
				mx = 0;
			}
		}
		else
		{
			cin >> x;
			int pre = pe(x) + 1;
			int nxt = nt(x);
//			printf("For x=%lld, pre=%lld, nxt=%lld\n", x, pre, nxt);
			int a = abs(pre - x);
			if(pre == -1)
			{
				a = inf / 2;
			}
			int b = abs(nxt - x);
			if(nxt == inf)
			{
				b = inf / 2;
			}
			printf("%.2f\n",
				min(
					max(
						a + (pre - mn - a) / 2.0,
						a + (mx - x - a) / 2.0
					),
					max(
						b + (mx - nxt - b) / 2.0,
						b + (x - mn - b) / 2.0
					)
				)
			);
		}
	}
} 
2024/10/19 18:37
加载中...