WsW_ @ 2023-07-12 17:25:10
#include<bits/stdc++.h>
using namespace std;
struct block{
int st,ed,size;
int tag;
}k[1010];
int n,q;
int len;
vector<int> v[1010];
int a[1000005],bel[1000005];
inline void update(int x){
for(int i=0;i<k[x].size;i++)v[x][i]=a[i+k[x].st];
sort(v[x].begin(),v[x].end());
}
inline void add(int l,int r,int ad){
if(bel[l]==bel[r]){
for(int i=l;i<=r;i++)a[i]+=ad;
update(bel[l]);
return ;
}
for(int i=l;i<=k[bel[l]].ed;i++)a[i]+=ad;
for(int i=k[bel[r]].st;i<=r;i++)a[i]+=ad;
for(int i=bel[l]+1;i<bel[r];i++)k[i].tag+=ad;//整块修改不改变排序
update(bel[l]);
update(bel[r]);
}
inline int find(int l,int r,int w){
int cnt=0;
if(bel[l]==bel[r]){
for(int i=l;i<=r;i++){
if(a[i]+k[bel[i]].tag>=w){
cnt++;
}
}
return cnt;
}
for(int i=l;i<=k[bel[l]].ed;i++){
if(a[i]+k[bel[i]].tag>=w){
cnt++;
}
}
for(int i=k[bel[r]].st;i<=r;i++){
if(a[i]+k[bel[i]].tag>=w){
cnt++;
}
}
for(int i=bel[l]+1;i<bel[r];i++){
cnt+=v[i].end()-lower_bound(v[i].begin(),v[i].end(),w-k[i].tag);
}
return cnt;
}
int main(){
scanf("%d%d",&n,&q);
len=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=len;i++){
k[i].st=n/len*(i-1)+1;
k[i].ed=n/len*i;
k[i].size=k[i].ed-k[i].st+1;
for(int j=k[i].st;j<=k[i].ed;j++){
bel[j]=i;
v[i].push_back(a[j]);
}
sort(v[i].begin(),v[i].end());
}
while(q--){
char opt;
int l,r,w;
cin>>opt;
scanf("%d%d%d",&l,&r,&w);
if(opt=='M'){
add(l,r,w);
}
else{
printf("%d\n",find(l,r,w));
}
}
return 0;
}
by Zxx132536 @ 2023-07-12 17:56:45
k[i].st=n/len*(i-1)+1;
k[i].ed=n/len*i;
这里
by WsW_ @ 2023-07-12 18:26:25
@Alpha_Go 谢谢
by WsW_ @ 2023-07-12 18:29:04
@Alpha_Go 但这里似乎没有错?
正确该怎么写?
by WsW_ @ 2023-07-12 18:34:50
懂了!确实有错,我改改