_TLEer_的小号 @ 2021-05-09 10:21:59
RT.
AC On 2,4,9,10,其他WA。
Code:
#include<iostream>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
int n,m,k,a[1000010],l,r,pos[1000010],cg[1000010],b[1000010];
char sz;
int blksz;
struct blk_T{
int le,rt,tag;
int erf(int k){
return blksz-(lower_bound(b+le,b+rt+1,k-tag)-(b+le));
}
}blk[10010];
int abr(int now){
return pos[now];
}
bool ism(int x,int y){
return abr(x)==abr(y);
}
void cgblk(int l,int r){
for(int i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+r+1);
}
void addblk(){
blksz=sqrt(n);
int blktot=0;
for(int i=0;i<n;i++){
pos[i]=blktot;
b[i]=a[i];
if(i>=(blktot+1)*blksz-1){
blk[blktot].le=blktot*blksz;
blk[blktot].rt=min(blk[blktot].le+blksz-1,n-1);
// system("pause");
blktot++;
cgblk(blk[blktot].le,blk[blktot].rt);
}
}
blk[blktot].le=blktot*blksz;
blk[blktot].rt=min(blk[blktot].le+blksz-1,n-1);
cgblk(blk[blktot].le,blk[blktot].rt);
// cout<<blktot<<' '<<blk[blktot].le<<' '<<blk[blktot].rt<<endl;
}
void add(int le,int rt,int k){
if(ism(le,rt)){
for(int i=le;i<=rt;i++)
a[i]+=k;
cgblk(blk[abr(rt)].le,blk[abr(rt)].rt);
return;
}
int lb=abr(le),rb=abr(rt);
add(le,blk[lb].rt,k);
add(blk[rb].le,rt,k);
lb++;rb--;
for(int i=lb;i<=rb;i++)
blk[i].tag+=k;
}
int ask(int le,int rt,int k){
int ans=0;
// cout<<le<<' '<<rt<<' '<<ism(le,rt)<<endl;
if(ism(le,rt)){
for(int i=le;i<=rt;i++)
if(a[i]+blk[abr(rt)].tag>=k)
ans++;
return ans;
}
int lb=abr(le),rb=abr(rt);
ans+=ask(le,blk[lb].rt,k)+ask(blk[rb].le,rt,k);
lb++;rb--;
for(int i=lb;i<=rb;i++)
ans+=blk[i].erf(k);
return ans;
}
signed main(){
cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
addblk();
for(int i=0;i<m;i++){
cin>>sz>>l>>r>>k;
l--,r--;
if(sz=='M'){
add(l,r,k);
}
else{
cout<<ask(l,r,k)<<endl;
}
}
return 0;
}
by syf1201 @ 2021-05-14 21:09:40
百万级别读入你给我来个cin?
by syf1201 @ 2021-05-14 21:19:27
lowerbound找不到就返回end
你这个要是找不到的话返回的end - begin好像比size小吧……
特判下块内是否存在大于等于w的数。
by syf1201 @ 2021-05-14 21:19:59
还有你这分块写得真是一言难尽……
我得我头疼……
by _TLEer_的小号 @ 2021-05-15 10:06:14
@祈愿救济者 感激不尽!
还有请问您所说的特判下块内是否存在大于等于w的数。
是在哪里特判,特判什么呢?
by syf1201 @ 2021-05-16 21:42:44
@_TLEer_的小号
for(int i=lb;i<=rb;i++)
ans+=blk[i].erf(k);
这里加上一个判断,右端点是否比k高