社区讨论
分块90pts求助玄关(T两个点)
P2801教主的魔法参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mhjbbfuk
- 此快照首次捕获于
- 2025/11/03 23:46 4 个月前
- 此快照最后确认于
- 2025/11/03 23:46 4 个月前
CPP
#include<iostream>
#include<algorithm>
#include<cmath>
#define gc getchar
#define N 1000005
#define sort stable_sort
#define int long long
int bar=2333;
int rd(){
int x=0,f=1;char c=gc();
for(;!isdigit(c);c=gc())f=c==45?-1:f;
for(; isdigit(c);c=gc())x=x*10+c-'0';
return x*f;
}
char rdc(){
char c=gc();
while(c!='A'&&c!='M')c=gc();
return c;
}
using namespace std;
int n,q;
int a[N],c[N],belong[N],len[N],cnt;
struct BAR{
int l,r,tag;
}b[N];
void Sort(int x){
for(int i=b[x].l;i<=b[x].r;i++)c[i]=a[i];
sort(c+b[x].l,c+b[x].r+1);
}
void build(){
cnt=(n-1)/bar+1;
for(int i=1;i<=cnt;i++)b[i].l=(i-1)*bar+1,b[i].r=i*bar;
b[cnt].r=n;
for(int i=1;i<=cnt;i++){
for(int j=b[i].l;j<=b[i].r;j++)belong[j]=i;
len[i]=b[i].r-b[i].l+1;
sort(c+b[i].l,c+b[i].r+1);
}
}
void add(int l,int r,int w){
int x=belong[l],y=belong[r];
if(x==y){
for(int i=l;i<=r;i++)a[i]+=w;
Sort(x);return;
}
for(int i=x+1;i<y;i++)b[i].tag+=w;
for(int i=l;i<=b[x].r;i++)a[i]+=w;
for(int i=b[y].l;i<=r;i++)a[i]+=w;
Sort(x),Sort(y);
}
int query(int l,int r,int C){
int x=belong[l],y=belong[r],ret=0;
if(x==y){
for(int i=l;i<=r;i++)
if(a[i]+b[x].tag>=C)ret++;
return ret;
}
for(int i=l;i<=b[x].r;i++)if(a[i]+b[x].tag>=C)ret++;
for(int i=b[y].l;i<=r;i++)if(a[i]+b[y].tag>=C)ret++;
for(int i=x+1;i<y;i++){
ret+=b[i].r-(lower_bound(c+b[i].l,c+b[i].r+1,C-b[i].tag)-c)+1;
}
return ret;
}
signed main(){
n=rd(),q=rd();
for(int i=1;i<=n;i++)a[i]=c[i]=rd();
while(q--){
char opt=rdc();
int l=rd(),r=rd(),w=rd();
if(opt=='M'){
add(l,r,w);
}
else {
printf("%lld\n",query(l,r,w));
}
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...