0pts 求调
查看原帖
0pts 求调
1657369
__liujy楼主2025/7/2 22:31

在 DEV 上运行的好好的,放洛谷上就 0pts 了。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,Q,a[N],b[N],lazy[N],len,id[N],l[N],r[N];
inline int work(int x)
{
	for(int i=l[id[x]];i<=r[id[x]];i++) b[i]=a[i];
	sort(b+l[id[x]],b+r[id[x]]+1);
}
inline void Add(int l,int r,int k)
{
	int L=id[l],R=id[r];
	if(L==R)
	{
		for(int i=l;i<=r;i++) a[i]+=k;
		work(l);
		return;
	}
	for(int i=l;id[i]==L;i++) a[i]+=k;
	work(l);
	for(int i=L+1;i<R;i++) lazy[i]+=k;
	for(int i=r;id[i]==R;i--) a[i]+=k;
	work(r);
}
inline int solve(int x,int key)
{
	int _left=l[x],_right=r[x];
	while(_left<=_right)
	{
		int mid=_left+((_right-_left)>>1);
		if(b[mid]<key) _left=mid+1;
		else _right=mid-1;
	}
	return r[x]-_left+1;
}
inline int query(int l,int r,int k)
{
	int L=id[l],R=id[r],ans=0;
	if(L==R)
	{
		for(int i=l;i<=r;i++) ans+=(a[i]+lazy[L]>=k);
		return ans;
	}
	for(int i=l;id[i]==L;i++) ans+=(a[i]+lazy[L]>=k);
	for(int i=L+1;i<R;i++) ans+=solve(i,k-lazy[i]);
	for(int i=r;id[i]==R;i--) ans+=(a[i]+lazy[R]>=k);
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>Q;
	for(int i=1;i<=n;i++) cin>>a[i];
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		id[i]=1+(i-1)/len;
		b[i]=a[i];
		l[i]=(i-1)*len+1;
		r[i]=i*len;
	}
	int tot=n/len+(n%len);
	r[tot]=n;
	for(int i=1;i<=tot;i++) sort(b+l[i],b+r[i]+1);
	while(Q--)
	{
		char type;
		int l,r,k;
		cin>>type>>l>>r>>k;
		if(type=='M') Add(l,r,k);
		else cout<<query(l,r,k)<<'\n';
	}
	return 0;
}
2025/7/2 22:31
加载中...