求助wa4,就一个数据不对
查看原帖
求助wa4,就一个数据不对
821939
zhi_hui_kan_ti_jie楼主2023/11/19 10:44
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int max(int a, int b){ return a > b ? a : b; }
inline int min(int a, int b){ return a < b ? a : b; }
inline double max(double a, double b){ return a > b ? a : b; }
inline double min(double a, double b){ return a < b ? a : b; }
const int maxn = 1e5 + 10;
struct node
{
	node(int l, int r){ this->l = l, this->r = r; }
	int l, r, mx, cnt=0,val=0;
	node* lson=NULL, *rson=NULL;

};
node root(0,1e15);
int arr[maxn];
inline void push_up(node* now)
{
	if (now->lson && (now->lson->cnt == 0))
	{
		delete now->lson;
		now->lson = NULL;
	}
	if (now->rson && (now->rson->cnt == 0))
	{
		delete now->rson;
		now->rson = NULL;
	}
	if (now->lson&&now->rson)
	{
		now->mx = now->rson->mx;
		now->cnt = now->lson->cnt + now->rson->cnt;
		now->val = now->rson->val + now->lson->val + (now->rson->mx - now->lson->mx)*(now->lson->cnt);
	}
	else if (now->lson)
	{
		now->mx = now->lson->mx;
		now->cnt = now->lson->cnt;
		now->val = now->lson->val;
	}
	else if (now->rson)
	{
		now->mx = now->rson->mx;
		now->cnt = now->rson->cnt;
		now->val = now->rson->val;
	}
	else
	{
		now->cnt = 0;
		now->val = 0;
	}
}
void update(node* now, int v, int x)
{
	int l = now->l, r = now->r;
	if (l == r)
	{
		now->mx = v;
		now->cnt+=x;
		return;
	}
	int mid = l + r >> 1;
	if (v <= mid)
	{
		if (!(now->lson))
		{
			now->lson = new node(l, mid);
		}
		update(now->lson, v,x);
	}
	else
	{
		if (!(now->rson))
		{
			now->rson = new node(mid + 1, r);
		}
		update(now->rson, v,x);
	}
	push_up(now);
}

node ask(node* now, int v)
{
	int l = now->l, r = now->r;
	if ((l==r) || (now->cnt <= v))
	{
		node ret = *now;
		return ret;
	}

	if (now->lson&&now->lson->cnt < v)
	{
		node ret(0, 0);
		if (now->rson)
		{
			node tb = ask(now->rson, v - now->cnt);
			ret.lson = now->lson;
			ret.rson = &tb;
			push_up(&ret);
		}
		return ret;
	}
	else if (now->lson)
	{
		return ask(now->lson, v);
	}
	else
		return ask(now->rson, v);
}

signed main()
{
	/*ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);*/
	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> arr[i];
		update(&root, arr[i],1);
	}
	for (int i = 1; i <= m; i++)
	{
		int op; cin >> op;
		if (op == 1)
		{
			int p, x; cin >> p >> x;
			update(&root, arr[p], -1);
			arr[p] = x;
			update(&root, arr[p], 1);
		}
		else
		{
			int v; cin >> v;
			int l = 1, r = n;
			node ans(0,0);
			int ansl;
			while (l <= r)
			{
				int mid = l + r >> 1;
				node tmp = ask(&root, mid);
				if (tmp.val < v)
				{
					ans = tmp;
					ansl = mid;
					l = mid + 1;
				}
				else
				{
					r = mid - 1;
				}
			}
			double an = (double)(v - ans.val) / (double)(ans.cnt) + ans.mx;
			printf("%.5lf\n", an);
		}
	}
	return 0;
}

麻木了,为什么啊

2023/11/19 10:44
加载中...