分块模板题求调
查看原帖
分块模板题求调
347664
菲斯斯夫斯基楼主2024/3/7 21:20

rt,谢谢。

都已经拍了好久了都没拍出来/ll

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m;
int a[N],id[N];
vector<int>v[N];
int ask(int l,int r,int c)
{
	int x=id[l],y=id[r],ans=0;
	if(x==y)
	{
		for(int i=l;i<=r;i++)
			ans+=a[i]>=c;
		return ans; 
	}
	for(int i=l;id[i]==x;i++)
		ans+=a[i]>=c;
	for(int i=x+1;i<y;i++)
		ans+=v[i].size()-(lower_bound(v[i].begin(),v[i].end(),c)-v[i].begin();
	for(int i=r;id[i]==y;i--)
		ans+=a[i]>=c;
	return ans;
}
void change(int x,int y)
{
	for(int i=0;i<v[id[x]].size();i++)
		if(v[id[x]][i]==a[x])
		{
			v[id[x]][i]=a[x]=y;
			break;
		}
	sort(v[id[x]].begin(),v[id[x]].end());
}
int main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	cin>>n;
	int len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		id[i]=(i-1)/len+1;
		v[id[i]].push_back(i);
	}
	for(int i=1;i<=id[n];i++)
		sort(v[i].begin(),v[i].end());
	cin>>m;
	while(m--)
	{
		int op,x,y,z;
		scanf("%d%d%d",&op,&x,&y);
		if(op==0)
		{
			scanf("%d",&z);
			printf("%d\n",ask(x,y,z));
		}
		else change(x,y);
	}
	return 0;
}

2024/3/7 21:20
加载中...