LBYYSM_123 @ 2023-07-20 13:48:35
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q;
int a[1000001],bel[1000001];
int st[1001],ed[1001],mark[1001];
vector<int> d[1001];
void build(){
q=sqrt(n);
for(int i=1;i<=q;i++)
st[i]=n/q*(i-1)+1,ed[i]=n/q*i;ed[q]=n;
for(int i=1;i<=q;i++){
for(int j=st[i];j<=ed[i];j++)
bel[j]=i,d[i].push_back(a[j]);
}
for(int i=1;i<=q;i++)
sort(d[i].begin(),d[i].end());
}
void reset(int x){
while(d[x].empty()!=0) d[x].pop_back();
for(int i=st[x];i<=ed[x];i++)
d[x].push_back(a[i]);
sort(d[x].begin(),d[x].end());
}
void add(int l,int r,int k){
if(bel[l]==bel[r]){
for(int i=l;i<=r;i++)
a[i]+=k;
reset(bel[l]);
}
else{
for(int i=l;i<=ed[bel[l]];i++)
a[i]+=k;
reset(bel[l]);
for(int i=st[bel[r]];i<=r;i++)
a[i]+=k;
reset(bel[r]);
for(int i=bel[l]+1;i<bel[r];i++)
mark[i]+=k;
}
}
int ask(int l,int r,int k){
int ans=0;
if(bel[l]==bel[r]){
for(int i=l;i<=r;i++)
if(a[i]+mark[bel[l]]>=k)
ans++;
return ans;
}
else{
for(int i=l;i<=ed[bel[l]];i++)
if(a[i]+mark[bel[l]]>=k)
ans++;
for(int i=st[bel[r]];i<=r;i++)
if(a[i]+mark[bel[r]]>=k)
ans++;
for(int i=bel[l]+1;i<bel[r];i++){
int x=k-mark[i];
ans+=lower_bound(d[i].begin(),d[i].end(),x)-d[i].begin();
}
return ans;
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build();
for(int i=1;i<=m;i++){
char c;int x,y,z;
cin>>c>>x>>y>>z;
if(c=='M') add(x,y,z);
else cout<<ask(x,y,z)<<endl;
}
return 0;
}```
by LBYYSM_123 @ 2023-07-20 13:55:43
只有
by H3PO4 @ 2023-07-20 14:22:24
@LBYYSM_123
ans+=lower_bound(d[i].begin(),d[i].end(),x)-d[i].begin();
->
ans+=d[i].end()-lower_bound(d[i].begin(),d[i].end(),x);
by H3PO4 @ 2023-07-20 14:28:15
@LBYYSM_123 还有这题不用开 long long
by LBYYSM_123 @ 2023-07-20 14:39:44
@H3PO4 谢谢您的好意,除此之外还要把代码中的while(d[x].empty()!=0) d[x].pop_back();
改成d[x].clear()
,警示后人,此贴结。