社区讨论
50分求调
P2801教主的魔法参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjukwah
- 此快照首次捕获于
- 2025/11/04 08:45 4 个月前
- 此快照最后确认于
- 2025/11/04 08:45 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int pos[1000001],st[1000001],ed[1000001],a[1000001],b[1000001],add[100010],n,m,t;
void change(int l,int r,int d){
if(pos[l]==pos[r]){
for(int i=st[pos[l]];i<=ed[pos[l]];i++)b[i]=a[i];
for(int i=l;i<=r;i++){a[i]+=d;b[i]+=d;}
sort(b+st[pos[l]],b+ed[pos[r]]+1);
return ;
}
else {
for(int i=pos[l]+1;i<pos[r];i++)add[i]+=d;
for(int i=st[pos[l]];i<=ed[pos[l]];i++)b[i]=a[i];
for(int i=l;i<=ed[pos[l]];i++){a[i]+=d;b[i]+=d;}
for(int i=st[pos[r]];i<=ed[pos[r]];i++)b[i]=a[i];
for(int i=st[pos[r]];i<=r;i++){a[i]+=d;b[i]+=d;}
sort(b+st[pos[l]],b+ed[pos[l]]+1);
sort(b+st[pos[r]],b+ed[pos[r]]+1);
}
return ;
}
int ef(int l,int r,int sum,int c){
int ans1=r+1,k=r;
while(l<=r){
int mid=(l+r)/2;
if(b[mid]+sum<c)l=mid+1;
else ans1=min(ans1,mid),r=mid-1;
}
return k-ans1+1;
}
int query(int l,int r,int c){
int num1=pos[l],num2=pos[r],ans=0;
if(num1==num2){
for(int i=l;i<=r;i++)if(a[i]+add[num1]>=c)ans++;
return ans;
}
else {
for(int i=l;i<=ed[num1];i++)if(a[i]+add[num1]>=c)ans++;
for(int i=st[num2];i<=r;i++)if(a[i]+add[num2]>=c)ans++;
for(int i=num1+1;i<num2;i++)ans+=ef(st[i],ed[i],add[i],c);
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
int len=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
pos[i]=(i-1)/len+1;
}
t=len;
for(int i=1;i<=len;i++){
st[i]=(i-1)*len+1;
ed[i]=i*len;
}
if(n%len){
t++;
st[t]=len*len+1;
ed[t]=n;
}
for(int i=1;i<=t;i++)sort(b+st[i],b+ed[i]+1);
while(m--){
char op;
cin>>op;
if(op=='M'){
int l,r,w;
cin>>l>>r>>w;
change(l,r,w);
}
else {
int l,r,c;
cin>>l>>r>>c;
cout<<query(l,r,c)<<'\n';
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...