分块保龄求调
  • 板块P4879 ycz的妹子
  • 楼主wyh0721
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/21 20:24
  • 上次更新2024/10/21 21:33:21
查看原帖
分块保龄求调
496117
wyh0721楼主2024/10/21 20:24
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=500005;
int n,m,sum;
int a[N],l[N],r[N],be[N],gs[N];
bool vis[N];
signed main()
{
	cin>>n>>m;
	int t=sqrt(N*1.0);
	int s=N/t;
	if(N%t!=0)
		s++;
	for(int i=1;i<=N;i++)
	{
		l[i]=(i-1)*t+1;
		r[i]=i*t;
	}
	r[s]=N;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
		vis[i]=1;
		be[i]=(i-1)/t+1;
		gs[be[i]]++;
	}
	while(m--)
	{
		char o;
		cin>>o;
		if(o=='Q')
			cout<<sum<<endl;
		if(o=='D')
		{
			int x,k=1,t;
			cin>>x;
			while(x-gs[k]>0)
			{
				x-=gs[k];
				k++;
			}
			gs[k]--;
			for(int i=l[k];i<=r[k];i++)
			{
				if(vis[i])
				{
					x--;
					if(x<1)
					{
						t=i;
						break;
					}
				}
			}
			n--;
			vis[t]=0;
			sum-=a[t];
			a[t]=0;
		}
		if(o=='C')
		{
			int x,y,k=1,t;
			cin>>x>>y;
			while(x-gs[k]>0)
			{
				x-=gs[k];
				k++;
			}
			for(int i=l[k];i<=r[k];i++)
			{
				if(vis[i])
				{
					x--;
					if(x<1)
					{
						t=i;
						break;
					}
				}
			}
			a[t]-=y;
			sum-=y;
		}
		if(o=='I')
		{
			int x,y,k=1,t;
			bool f=1;
			cin>>x>>y;
			if(x>n)
			{
				x--;
				f=0;
			}
			while(x-gs[k]>0)
			{
				x-=gs[k];
				k++;
			}
			for(int i=l[k];i<=r[k];i++)
			{
				//cout<<666;
				if(vis[i])
				{
					x--;
					if(x<1)
					{
						t=i;
						break;
					}
				}
			}
			if(!f)
            {
                t++;
                gs[be[t]]++;
            }
			vis[t]=1;
			sum-=a[t];
			a[t]=y;
			sum+=a[t];
		}
	}
	return 0;
}


2024/10/21 20:24
加载中...