WA#18 求调
查看原帖
WA#18 求调
848964
hzoi_Shadow楼主2024/7/26 21:32

在学校OJ上过了,luogu 没过

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
const double eps=1e-15;
ll a[50010],pos[50010],L[50010],R[50010],klen,ksum,P,Q;
pair<ll,ll>p[50010];
deque<ll>q[50010];
ll x(ll i)
{
	return p[i].first;
}
ll y(ll i)
{
	return p[i].second;
}
void build(ll l,ll r,ll id)
{
	q[id].clear();
	ll sx=0,sy=0;
	for(ll i=l;i<=r;i++)
	{
		sx+=(a[i]>=0)*a[i];
		sy+=(a[i]<0)*a[i];
		p[i]=make_pair(sx,sy);
		while(q[id].size()>=2&&(y(q[id][q[id].size()-2])-y(q[id].back()))*(x(q[id].back())-x(i))<=(y(q[id].back())-y(i))*(x(q[id][q[id].size()-2])-x(q[id].back())))
		{
			q[id].pop_back();
		}
		q[id].push_back(i);
	}
}
bool check(ll mid,ll id)
{
	return (y(q[id][mid+1])-y(q[id][mid]))*P>=Q*(x(q[id][mid+1])-x(q[id][mid]));
}
ll divide_search(ll id)
{
	ll l=0,r=q[id].size()-1,mid,ans=0;
	while(l<r)
	{
		mid=(l+r)/2;
		if(check(mid,id)==true)
		{
			ans=mid+1;
			l=mid+1;
		}
		else
		{
			r=mid;
		}
	}
	return q[id][ans];
}
void init(ll n)
{
	klen=sqrt(n*log2(n));
	ksum=n/klen;
	for(ll i=1;i<=ksum;i++)
	{
		L[i]=R[i-1]+1;
		R[i]=R[i-1]+klen;
	}
	if(R[ksum]<n)
	{
		ksum++;
		L[ksum]=R[ksum-1]+1;
		R[ksum]=n;
	}
	for(ll i=1;i<=ksum;i++)
	{
		for(ll j=L[i];j<=R[i];j++)
		{
			pos[j]=i;
		}
		build(L[i],R[i],i);
	}
}
void update(ll x,ll y)
{
	P-=(a[x]>=0)*a[x];
	Q-=(a[x]<0)*a[x];
	a[x]=y;
	P+=(a[x]>=0)*a[x];
	Q+=(a[x]<0)*a[x];
	build(L[pos[x]],R[pos[x]],pos[x]);
}
ll query()
{
	ll id=0,sum=0,sx=0,sy=0;
	double ans=-0x7f7f7f7f;
	for(ll i=1;i<=ksum;i++)
	{
		sum=divide_search(i);
		if(1.0*(p[sum].first+sx)/P-1.0*(p[sum].second+sy)/Q-ans>eps)
		{
			ans=1.0*(p[sum].first+sx)/P-1.0*(p[sum].second+sy)/Q;
			id=sum;
		}
		sx+=p[R[i]].first;
		sy+=p[R[i]].second;
	}
	return id;
}
int main()
{
	ll n,m,x,y,i;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		P+=(a[i]>=0)*a[i];
		Q+=(a[i]<0)*a[i];
	}
	init(n);
	cout<<query()<<endl;
	for(i=1;i<=m;i++)
	{
		cin>>x>>y;
		update(x,y);
		cout<<query()<<endl;
	}
	return 0;
}
2024/7/26 21:32
加载中...