社区讨论

整体二分求助

P2617Dynamic Rankings参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo7vxph4
此快照首次捕获于
2023/10/27 08:38
2 年前
此快照最后确认于
2023/10/27 08:38
2 年前
查看原帖
CPP
#include<iostream>
#include<cstring>
#define mn 200010
#define inf 0x3f3f3f3f3f3f3f3f
#define ll long long
#define FOR(i,x,y) for(int i=x;i<=y;++i)
#define ROF(i,x,y) for(int i=x;i>=y;--i)
using namespace std;
int n,m,cnt,tmp;
struct Query
{
   int op;
   int x,y,k;
   int id;	
}q[mn<<1],lq[mn<<1],rq[mn<<1];
ll a[mn];
ll tr[mn]; 
ll ans[mn];
ll mina=inf,maxa;
inline ll query(ll x)
{
	ll res=0;
	for(;x;x-=x&-x)res+=tr[x];
	return res;
}
inline void update(ll x,ll k)
{
	for(;x<=n;x+=x&-x)tr[x]+=k;
}
inline void solve(ll lval,ll rval,int st,int ed)
{
	if(st>ed)return;
	if(lval==rval)
	{
		FOR(i,st,ed)if(q[i].op==1)ans[q[i].id]=lval;
		return;
	}
	ll mid=lval+rval>>1;
	ll lt=0,rt=0;
	FOR(i,st,ed)
	{
		if(q[i].op==0)
		{
			if(q[i].y<=mid) 
			{
				update(q[i].x,q[i].y);
				lq[++lt]=q[i];
			}
			else rq[++rt]=q[i];
		}
		else
		{
			int t=query(q[i].y)-query(q[i].x-1);
			if(t>=q[i].k)lq[++lt]=q[i];
			else
			{
				q[i].k-=t;
				rq[++rt]=q[i];
			}
		}
	}
	FOR(i,1,lt)
	if(lq[i].op==0)
	update(lq[i].x,-lq[i].y);
	FOR(i,1,lt)q[st+i-1]=lq[i];
	FOR(i,1,rt)q[st+lt+i-1]=rq[i];
	solve(lval,mid,st,st+lt-1);
	solve(mid+1,rval,st+lt,ed);
}
int main()
{
	memset(ans,-1,sizeof(ans));
	cin>>n>>m;
	FOR(i,1,n)
	{
	    cin>>a[i];
	    q[++cnt]={0,i,1,a[i]};
	}
	FOR(i,1,m)
	{
		char opt;
		cin>>opt;
		if(opt=='Q')
		{
		   int l,r,k;
		   cin>>l>>r>>k;
		   q[++cnt]={1,l,r,k,i};
	    }
	    else
	    {
	    	int x,y;
	    	cin>>x>>y;
	    	q[++cnt]={0,x,-1,a[x],0};
	    	a[x]=y;
	    	q[++cnt]={0,x,1,y,0};
		}
	}
	solve(0,inf,1,cnt);
	FOR(i,1,m)if(ans[i]!=-1)cout<<ans[i]<<endl;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...